我应该把`include`声明放在哪里?

时间:2012-12-03 06:12:47

标签: ruby module

我正在尝试将模块用作常量的命名空间。假设我有一个这样的模块:

module AnimalModule
  Dog = 1
end

和一个名为PetStore的类,它使用该模块。我应该在哪里放置include声明?

(1)是这样的:

# PetStore.rb
include AnimalModule
class PetStore
end

(2)或者像这样:

# PetStore.rb
class PetStore
  include AnimalModule
end

我尝试在我的类的实例方法中使用常量,并且两种方式看起来都是一样的:

class PetStore
  def feed
    puts Dog
  end 
end

2 个答案:

答案 0 :(得分:2)

您可以像在第二段代码中一样在课后包含模块:

C:\Users\Hunter>irb
irb(main):001:0> module AnimalModule
irb(main):002:1>   Dog = 1
irb(main):003:1> end
=> 1
irb(main):004:0> class PetStore
irb(main):005:1>   include AnimalModule
irb(main):006:1>   def feed
irb(main):007:2>     puts Dog
irb(main):008:2>   end
irb(main):009:1> end
=> nil
irb(main):010:0> p = PetStore.new()
=> #<PetStore:0x25e07b0>
irb(main):011:0> p.feed
1
=> nil

我在交互式解释器中使用了您的代码,并且在调用1方法时获得了feed()

答案 1 :(得分:2)

第二种风格是正确的选择。区别在于Dog的范围。第一个包括更大范围的模块。所以它也适用于你的例子。但它不会提供您想要的命名空间。

module AnimalModule
  Dog = 1
end
class PetStore
  include AnimalModule
end
Dog # => NameError: uninitialized constant Dog
PetStore::Dog # => 1

include AnimalModule
Dog # => 1