Created
September 13, 2016 02:07
-
-
Save mgiagante/6dec4707d5f734f54ff617b58f52ebb3 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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