我希望这段代码:
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
有人可以解释一下吗?
答案 0 :(得分: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" }
答案 1 :(得分:1)
print_call_and_return(“parameter”)打印“参数”并返回“返回”
所以到目前为止的输出是“参数”
put print_call_and_return(“parameter”)对返回值执行put,即“return”
所以到目前为止的输出是“参数”,然后是“返回”
将答案为nil,并且put do #anything什么都不做。 do比任何表达式都弱,所以该块适用于(puts函数)do,而不是puts(函数do)。
输出符合预期。