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ブロックされずエラーになります。putsinstance_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 に答える