16

rubykoansチュートリアルのコード スニペットをお見せします。次のコードを検討してください。

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**?

実際、質問はコメントにあります(アスタリスクで強調しました(太字にするつもりでしたが))。誰か説明してくれませんか?前もって感謝します!

4

1 に答える 1

31

これはここで答えられます:Ruby:クラス定義の明示的なスコープ。しかし、おそらくそれはあまり明確ではありません。リンク先の記事を読んでいただければ、答えを導き出すことができます。

基本的に、Birdは のスコープで宣言されてMyAnimalsおり、定数の解決時に優先度が高くなります。Oyster名前空間にありMyAnimalsますが、そのスコープで宣言されていません。

で各クラスに挿入p Module.nestingすると、囲んでいるスコープが何であるかがわかります。

class MyAnimals
  LEGS = 2

  class Bird < Animal

    p Module.nesting
    def legs_in_bird
      LEGS
    end
  end
end

収量:[AboutConstants::MyAnimals::Bird, AboutConstants::MyAnimals, AboutConstants]

class MyAnimals::Oyster < Animal
  p Module.nesting

  def legs_in_oyster
    LEGS
  end
end

収量:[AboutConstants::MyAnimals::Oyster, AboutConstants]

違いを見ます?

于 2012-12-02T12:24:36.723 に答える