gpt4 book ai didi

使用 instance_eval 改进 Ruby

转载 作者:数据小太阳 更新时间:2023-10-29 08:07:35 24 4
gpt4 key购买 nike

我想对 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 methodspeak' 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com