我正在扩展一个类以接受 DSL。实例应始终以默认值进行响应,但代码可能会更改。当我调用 who_am_i
时,下面的代码工作正常,它设置了 i_am
方法,但我不知道如何设置默认方法。
module Helper
def i_am
"Default code"
end
def who_am_i
class_eval(<<-EOS, __FILE__, __LINE__ + 1)
def i_am
"This was executed in class: \#{self.class.to_s}"
end
EOS
end
end
class Test
extend Helper
end
t = Test.new
t.i_am
我可以通过这样做来完成这项工作:
class Test2
extend Helper
include Helper
end
t2 = Test2.new
t2.i_am
但这看起来很奇怪。想法?
最佳答案
您需要使用包含的方法/ Hook 。每次给定模块包含到其他类或模块中时都会运行它,并以此类或模块为参数。根据您的情况,您想要:
module Helper
def i_am
"Default code"
end
def self.included mod
mod.extend ClassMethods
end
module ClassMethods
def who_am_i
class_eval(<<-EOS, __FILE__, __LINE__ + 1)
def i_am
"This was executed in class: \#{self.class.to_s}"
end
EOS
end
end
end
class Tester
include Helper
end
关于ruby - 模块同时扩展和包含?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20181581/