我正在尝试将模块混合到一个类中,我希望某些方法可以作为类方法运行,而其他方法则是实例方法。
但是,我不想同时使用include
和 extend
模块。我宁愿只是include
。
当我用这种表示法包装我想成为类方法的方法时,它可以工作:
class <<
# ...
end
但是,当我使用这种表示法时,它不起作用:
class << self
# ...
end
我怀疑self
关键字正在建立与模块的显式绑定,而不是它混入的类。但是,我没有看到任何建议在使用self
表示法时关闭class <<
关键字的文档。
有谁知道这是怎么回事?
更新:以下是一些示例代码,以便更清晰:
module M
class <<
def class_method
puts "From inside the class_method"
end
end
def instance_method
puts "From inside the instance_method"
end
end
class Object
include M
end
class C
end
C.class_method
obj = C.new
obj.instance_method
答案 0 :(得分:6)
class <<
必须始终跟一个对象。仅class <<; end
是语法错误。在您的情况下,它看起来像是有效的,因为以下内容:
class <<
def class_method
puts "From inside the class_method"
end
end
与
相同class << def class_method
puts "From inside the class_method"
end
end
与
相同temp = def class_method
puts "From inside the class_method"
end
class << temp
end
与
相同def class_method
puts "From inside the class_method"
end
class << nil
end
与
相同def class_method
puts "From inside the class_method"
end
当然,这并没有实际定义一个类方法。它定义了一个实例方法。
答案 1 :(得分:0)
是的,如果您想在模块中获得真实self
,请使用included
callback。这样的事情指向了正确的方向:
module Bar
def self.included(base)
class << base
def class_method
"class_method"
end
end
end
end
class Foo
include Bar
end
p Foo.class_method # => "class_method"