Ruby Koans: alcance explícito en una definición de clase parte 2
Quería aclarar algunas cosas de este @ originenvia. La respuesta sugirió que Ruby busca la definición constante en este orden:
El alcance de cierre Cualquier ámbito externo (repita hasta alcanzar el nivel superior) Módulos incluidosSuperclase (s)ObjetNúcleara aclarar, en qué paso (1-6) es el valor de la constanteLEGS
encontrado paralegs_in_oyster
? ¿Es de la SuperclaseAnimal
? Es el alcance de la claseMyAnimals
ignorado porque no se considera un ámbito de cobertura? ¿Es esto debido a la explícitaMyAnimals::Oyster
definición de clase?
¡Gracias! Solo trato de entender. Aquí está el código:
class Animal
LEGS = 4
def legs_in_animal
LEGS
end
class NestedAnimal
def legs_in_nested_animal
LEGS
end
end
end
def test_nested_classes_inherit_constants_from_enclosing_classes
assert_equal 4, Animal::NestedAnimal.new.legs_in_nested_animal
end
# ------------------------------------------------------------------
class MyAnimals
LEGS = 2
class Bird < Animal
def legs_in_bird
LEGS
end
end
end
def test_who_wins_with_both_nested_and_inherited_constants
assert_equal 2, MyAnimals::Bird.new.legs_in_bird
end
# QUESTION: Which has precedence: The constant in the lexical scope,
# or the constant from the inheritance heirarachy?
# ------------------------------------------------------------------
class MyAnimals::Oyster < Animal
def legs_in_oyster
LEGS
end
end
def test_who_wins_with_explicit_scoping_on_class_definition
assert_equal 4, MyAnimals::Oyster.new.legs_in_oyster
end
# QUESTION: Now Which has precedence: The constant in the lexical
# scope, or the constant from the inheritance heirarachy? Why is it
# different than the previous answer?
end