I'll show your the code snippet from rubykoans tutorial. Consider the next code:
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 hierarchy?
# ------------------------------------------------------------------
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 hierarchy? Why is it
# **different than the previous answer**?
Actually the question is in comments (I highlighted it with asteriks (though it intended to be in bold)). Can anybody explain me please? Thanks in advance!
This is answered here: Ruby: explicit scoping on a class definition. But perhaps it's not super clear. If you read the linked article it will help you with the answer.
Basically, Bird
is declared in the scope of MyAnimals
, which has a higher precedence when resolving constants. Oyster
is in the MyAnimals
namespace, but it is not declared in that scope.
Inserting p Module.nesting
into each class with show you what the enclosing scopes are.
class MyAnimals
LEGS = 2
class Bird < Animal
p Module.nesting
def legs_in_bird
LEGS
end
end
end
Yields: [AboutConstants::MyAnimals::Bird, AboutConstants::MyAnimals, AboutConstants]
And
class MyAnimals::Oyster < Animal
p Module.nesting
def legs_in_oyster
LEGS
end
end
Yields: [AboutConstants::MyAnimals::Oyster, AboutConstants]
See the difference?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With