Skip to content

Instantly share code, notes, and snippets.

@mgiagante
Created September 13, 2016 02:07
Show Gist options
  • Save mgiagante/6dec4707d5f734f54ff617b58f52ebb3 to your computer and use it in GitHub Desktop.
Save mgiagante/6dec4707d5f734f54ff617b58f52ebb3 to your computer and use it in GitHub Desktop.
VALUE = 'global'
module A
VALUE = 'A'
class B
VALUE = 'B'
def self.value
VALUE
end
def value
'iB'
end
end
def self.value
VALUE
end
end
class C
class D
VALUE = 'D'
def self.value
VALUE
end
end
module E
def self.value
VALUE
end
end
def self.value
VALUE
end
end
class F < C
VALUE = 'F'
end
require 'pry'; binding.pry
#TODO: Por favor, revisar las afirmaciones de abajo.
=begin
¿Qué imprimen cada una de las siguientes sentencias? ¿De dónde está obteniendo el valor?
A.value es un método que expone el módulo A. En su implementación, devuelve el valor de la constante VALUE del mismo módulo.
A::B.value es un método de clase definido en la clase B que está definida dentro del módulo A. En su implementación, devuelve el
valor de la constante VALUE local a la clase B.
C::D.value es un método de clase definido en la clase D que está anidada dentro de la clase C. En su implementación, devuelve el valor de la constante VALUE local a la clase D.
C::E.value es un método que expone el módulo E, el cual se encuentra definido dentro de la clase C. En su implementación, retorna el valor de una constante VALUE. Como no existe una en el scope del módulo, retorna la constante VALUE global definida en el scope más externo en el programa.
F.value es un método de clase de la clase F, que lo hereda de la clase C. La clase F también tiene definida la constante VALUE con el valor 'F'. Sin embargo, como las clases no heredan constantes, la clase F no tiene a VALUE definida en su scope, así que devuelve la VALUE global.
¿Qué pasaría si ejecutases las siguientes sentencias? ¿Por qué?
A::value invoca al método expuesto por el módulo A, que devuelve la constante definida en el mismo módulo.
A.new.value devuelve un error indicando que el módulo A no tiene definido un método llamado new. Los módulos no responden a new
por defecto, ya que no se instancian.
B.value devuelve un error de constante no inicializada, pues B solo existe como una clase dentro de A.
C::D.value invoca al método value definido en la clase D, que está anidada en la clase C. Esto devuelve el valor de la constance
VALUE definida en la clase D.
C.value invoca al método de clase value de la clase C. Dado que esta no tiene una definicion local de la constante VALUE, retorna la global.
F.superclass.value devuelve lo mismo que C.value, pues C es la superclase de F.
=end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment