Nat*_*han 5 ruby module metaprogramming mixins
我正在尝试将一个模块混合到一个类中,我想要一些方法作为类方法,其他方法作为实例方法.
但是,我不想同时include 和 extend模块.我宁愿include这么做.
当我用这种表示法包装我想成为类方法的方法时,它可以工作:
class <<
# ...
end
Run Code Online (Sandbox Code Playgroud)
但是,当我使用这种表示法时,它不起作用:
class << self
# ...
end
Run Code Online (Sandbox Code Playgroud)
我怀疑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
Run Code Online (Sandbox Code Playgroud)
class <<必须始终跟一个对象.只是class <<; end语法错误.在你的情况下它看起来像是有效的,因为以下内容:
class <<
def class_method
puts "From inside the class_method"
end
end
Run Code Online (Sandbox Code Playgroud)
是相同的
class << def class_method
puts "From inside the class_method"
end
end
Run Code Online (Sandbox Code Playgroud)
这是一样的
temp = def class_method
puts "From inside the class_method"
end
class << temp
end
Run Code Online (Sandbox Code Playgroud)
这是一样的
def class_method
puts "From inside the class_method"
end
class << nil
end
Run Code Online (Sandbox Code Playgroud)
这是一样的
def class_method
puts "From inside the class_method"
end
Run Code Online (Sandbox Code Playgroud)
当然,这实际上并没有定义一个类方法.它定义了一个实例方法.