约翰,我不确定你是否还在思考这个问题,但在Ruby中有两种不同的使用模块的方式。A.) 直接在代码中以它们自包含的形式Base::Tree.entity(params)使用模块,或者B.) 将模块用作混合类或帮助方法。
A. 允许您将模块用作命名空间模式。这对于存在方法名称冲突的大型项目很有用。
module Base
module Tree
def self.entity(params={},&block)
end
end
end
现在,您可以使用此功能在代码中创建某种树形结构,而无需为每次对Base :: Tree.entity的调用实例化新类。
另一种进行命名空间的方法是逐个类进行。
module Session
module Live
class Actor
attr_accessor :type, :uuid, :name, :status
def initialize(params={},&block)
@block = block
end
def hit_rock_bottom
end
def has_hit_rock_bottom?
end
...
end
end
class Actor
attr_accessor :id,:scope,:callback
def initialize(params={},&block)
self.callback = block if block_given?
end
def respond
if self.callback.is_a? Proc
end
end
end
end
现在我们的类可能存在重叠。当我们创建一个Actor类时,我们需要确保它是正确的类,这就是命名空间派上用场的地方。
Session::Live::Actor.new(params) do |res|...
Session::Actor.new(params)
B. 混入(Mix-Ins)
这些是你的好朋友。在你认为需要在代码中多次执行某个操作时使用它们。
module Friendly
module Formatter
def to_hash(xmlstring)
return hash
end
def remove_trailing_whitespace(string,&block)
end
end
end
现在,每当您需要将xml字符串格式化为哈希表,或在未来的任何代码中删除尾随空格时,只需混合使用即可。
module Fun
class Ruby
include Friendly::Formatter
attr_accessor :string
def initialize(params={})
end
end
end
现在您可以在您的类中格式化字符串。
fun_ruby = Fun::Ruby.new(params)
fun_ruby.string = "<xml><why><do>most</do><people></people><use>this</use><it>sucks</it></why></xml>"
fun_ruby_hash = fun_ruby.to_hash(fun_ruby.string)
希望这已经是足够好的解释了。上述提出的观点是扩展类的良好示例,但使用模块时,难点在于何时使用
self关键字。它指的是 Ruby 对象层次结构中对象的范围。因此,如果您想将模块用作混合项,并且不想声明任何单例内容,请不要使用 self 关键字;然而,如果您想在对象内保留状态,请只使用类并混入所需的模块。