为什么没有"#34;延伸"为一个类添加一个常量,同时"包括"呢?

时间:2014-10-06 05:22:52

标签: ruby class module

我有以下代码:

module Books
  MINBOOKPRICE = 10
end

这应该在类级别添加模块内容:

class BuySoon
  extend Books
end

但:

BuySoon::MINBOOKPRICE #=> NameError: uninitialized constant BuySoon::MINBOOKPRICE

相反,如果我这样做,应该在BuySoon实例级别添加模块内容:

class BuySoon
  include Books
end

然后我得到

BuySoon::MINBOOKPRICE #=> 10

我是如何在模块中设置常量的?

1 个答案:

答案 0 :(得分:1)

include“增强实例”,而extend“增强了类本身。”常量是类的属性(属于类'范围),这就是使用include增强实例的原因自动获取定义的类常量。可以认为include指令在c++中具有“内联”功能:代码实际上是在include指令中复制粘贴的。

无论你是否调用extend,都要增强本征类。因此,常量将在BuySoon.singleton_class::MINBOOKPRICE处可用。换句话说,代码类似于:

包含:

class BuySoon
  MINBOOKPRICE = 10
end

<强>延伸:

class BuySoon
  class << self
    MINBOOKPRICE = 10
  end
end

希望它有所帮助。