1

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

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
4

2 回答 2

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()方法的结果。

于 2012-12-03T06:15:48.850 回答
2

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

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

include AnimalModule
Dog # => 1
于 2012-12-03T07:43:42.863 回答