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") 对返回值执行 put,即“return”

所以到目前为止的输出是“参数”,然后是“返回”

puts 答案为零,而 puts do #anything 什么都不做。do 比任何表达式都弱,因此该块适用于 (puts function) do,而不是 puts (function do)。

输出符合预期。

于 2013-03-04T18:58:40.633 回答