私は StackOverflow を見回す機会があり、Ruby Koans からよりよく理解しようとしていたこの同じ質問を見つけました ( Ruby Koans: クラス定義の明示的なスコープ パート 2 )。
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?
リンクの説明に基づいて、他の人 (私を含む) が持っていた主な混乱は、クラス定義が原因だったようです:
class MyAnimals::Oyster < Animal
# stuff goes in here
end
私の当初の考えでは、MyAnimals::Oyster は Oyster クラスが MyAnimals 内で定義されたことを意味するというものでした。つまり、上記のコードは次のコードに似ていると思いました。
class MyAnimals
class Oyster < Animal
# stuff goes in here
end
end
私の考えをテストするために、IRB で次のことを行いました。
class MyAnimals
LEGS = 2
class Bird < Animal
def legs_in_bird
LEGS
end
end
end
class MyAnimals::Oyster # You should notice that I'm not inheriting from Animal anymore
def legs_in_oyster
LEGS
end
end
私の推論が正しければ、以下のコードは 2 を返すと予想されます。
MyAnimals::Oyster.new.legs_in_oyster # => NameError: uninitialized constant MyAnimals::Oyster::LEGS
これは 2 を返さないので、なぜ 2 を返さないのか説明してもらえますか?
編集: Animal クラスの追加を怠りました。ここにあります:
class Animal
LEGS = 4
def legs_in_animal
LEGS
end
class NestedAnimal
def legs_in_nested_animal
LEGS
end
end
end