我想对 DSL 进行一些改进。我能够使用此示例进行改进:
module ArrayExtras
refine Array do
def speak
puts 'array!'
end
end
end
module MyUniverse
using ArrayExtras
class Thing
def initialize
[1].speak
end
end
end
MyUniverse::Thing.new
这会打印出“数组!”正好。但是一旦我引入instance_eval
,方法就找不到了:
module MyUniverse
using ArrayExtras
class DSL
def initialize(&block)
instance_eval(&block)
end
end
end
MyUniverse::DSL.new do
[1].speak
end
我得到一个undefined method
speak' for [1]:Array (NoMethodError)`
有没有办法在 instance_eval 中进行优化?
最佳答案
精化是词法范围的。您在错误的词汇上下文中激活了优化。您需要在调用精炼方法的地方激活它:
module ArrayExtras
refine Array do
def speak
puts 'array!'
end
end
end
module MyUniverse
class DSL
def initialize(&block)
instance_eval(&block)
end
end
end
using ArrayExtras
MyUniverse::DSL.new do
[1].speak
end
# array!
关于使用 instance_eval 改进 Ruby,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34304218/