以下代码使我感到惊讶。我认为这是一个危险的陷阱:既容易遇到,又难以调试。(1..5).each do |number| comment = " is even" if number%2==0 puts number.to_s + comment.to_send打印:12 is even34 is even5但是如果我在块之前添加comment =任何内容 ...comment = nil(1..5).each do |number| comment = " is even" if number%2==0 puts number.to_s + comment.to_send然后我得到:12 is even3 is even4 is even5 is even基本上,当仅在块内部定义变量时,然后在块末尾销毁该变量,然后nil在每次迭代时将其重置为。通常就是您所期望的。但是如果变量是该块之前所定义,然后将外变量用于块内,并且它的值是因此迭代之间持久的。一种解决方案是改为编写此代码:comment = number%2==0 ? " is even" : nil我认为很多人(包括我在内)倾向于写“ a = b if c”而不是“ a = (c ? b : nil)”,因为它更具可读性,但显然有副作用。