16

我将向您展示ruby​​koans教程中的代码片段。考虑下一个代码:

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: explicit scoping on a class definition。但也许不是很清楚。如果您阅读链接的文章,它将帮助您找到答案。

基本上,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 回答