3

如果我有一堂课:

class KlassWithSecret
  def initialize
    @secret = 99
  end
end

并运行:

puts KlassWithSecret.new.instance_eval { @secret }

它打印 99,但如果我运行:

puts KlassWithSecret.new.instance_eval do
  @secret
end

它返回一个错误:`instance_eval': wrong number of arguments (0 for 1..3) (ArgumentError)

为什么我不能使用 do/end 块instance_eval

PS 我正在使用 Ruby 2.1.0。

4

5 回答 5

5

将提供给puts的表达式括在括号中,因为块的优先级较低do..end

puts( KlassWithSecret.new.instance_eval do
  @secret
end )

或使用块的大括号语法

puts KlassWithSecret.new.instance_eval {
  @secret
}
于 2014-01-10T11:23:17.563 回答
4

这是因为当您使用花括号传递块时,它会传递给instance_eval方法。但是如果你用 传递它do-end,它就会传递给puts方法,所以instance_eval不会阻塞并引发错误。

于 2014-01-10T11:24:06.847 回答
3

这是因为当您使用 do..end 块时,该块被传递给 puts 函数。如果您这样编写,带有 do..end 块的代码将起作用

puts(KlassWithSecret.new.instance_eval do
  @secret
end)
于 2014-01-10T11:26:41.123 回答
0
a = Proc.new {@secret}
puts KlassWithSecret.new.instance_eval(&a)
# 99

它说puts KlaccWithSecret do @secret end没有获得Proc(块)。

于 2014-01-10T12:01:10.293 回答
-1

Ruby(2.0.0) 有效。代码:

KlassWithSecret.new.instance_eval do
  p @secret
end
# 99

没问题。

于 2014-01-10T11:29:15.890 回答