为什么这段代码不符合我的期望

时间:2013-03-04 18:47:28

标签: ruby puzzle

我希望这段代码:

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

有人可以解释一下吗?

2 个答案:

答案 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)。

输出符合预期。