2

私はこのコードを期待します:

def print_call_and_return(string, &block)
  puts string
  block.call unless !block
  "return"
end

puts print_call_and_return("parameter") do
  puts "block"
end

印刷する:

parameter
block
return

ただし、実際には次のように出力されます。

irb(main):011:0> puts print_call_and_return("parameter") do
irb(main):012:1* puts "block"
irb(main):013:1> end
parameter
return
=> nil

誰かがこれを説明できますか?

4

2 に答える 2

1

これは機能します:

puts print_call_and_return("parameter") { puts "block" }

その理由は、演算子の優先順位に関係していると思います。ブロックdo/endよりも優先順位が高くなります。{}

puts print_call_and_return("parameter") do
  puts "block"
end

と同じです

puts(print_call_and_return("parameter")){ puts "block" }
于 2013-03-04T18:58:25.590 に答える
1

print_call_and_return( "parameter")は、 "parameter"を出力し、"return"を返します。

したがって、これまでの出力は「パラメータ」です。

puts print_call_and_return( "parameter")は、戻り値( "return")をputsします。

したがって、これまでの出力は「パラメータ」、次に「リターン」です。

putsはnilに答え、putsdo#anythingは何もしません。doはどの式よりも弱いため、ブロックはputs(関数do)ではなくdo(puts関数)に適用されます。

出力は期待どおりです。

于 2013-03-04T18:58:40.633 に答える