我正在尝试使用Russ Olsen在他的书“Eloquent Ruby”中公开的方法来构建一个简单的DSL。但它对我不起作用。我们考虑以下代码:
class SayHello
def initialize
@message = "Hello."
instance_eval(yield) if yield
end
def say_it
puts @message
end
end
SayHello.new { say_it }
我得到的错误是:
say_hello.rb:12:in `block in <main>': undefined local variable or method `say_it' for main:Object (NameError)
from say_hello.rb:4:in `initialize'
from say_hello.rb:12:in `new'
from say_hello.rb:12:in `<main>'
但是......当你使用instance_eval
方法时,self
的值不应该分配给调用方法的对象?
提前致谢!
答案 0 :(得分:5)
当块运行时,您希望self
等于SayHello
实例,而不是main
对象。
我用Google搜索“ruby change self for a block”并找到a good answer,这让我认为你应该将代码更改为:
class SayHello
def initialize(&p)
@message = "Hello."
instance_eval(&p) if block_given?
end
def say_it
puts @message
end
end
SayHello.new { say_it }