为什么Ruby函数在嵌套循环中不会打破'true'?

时间:2014-04-28 12:38:50

标签: ruby

这是一段Ruby代码,用于检查给定的电子邮件地址是否是我的电子邮件类属性中“To:”接收器数组的一部分。在列表中找到email_address时,代码应返回true,否则返回false。

def is_to_receiver?(email_address)
  if @raw_email.to != nil
    @raw_email.to.each do |to_field|
      if to_field == email_address
        true
      else
        next
      end
    end
  end
  false
end

我一直认为第5行中的true会立即破坏函数并返回值为true的函数。但是,匹配的电子邮件地址的结果仍然是第11行的false。我必须将第5行更改为return true才能使其正常工作。

我将代码从Ruby 1.8.7迁移到Ruby 1.9.3。并且很确定它以前工作正常。我很好奇,如果我只是犯了一个错误,或者自Ruby 1.9.3以来这种行为发生了变化?欢迎任何回复!

2 个答案:

答案 0 :(得分:3)

如果Ruby方法中没有return语句,Ruby将返回最后执行的语句的值。否则,只有文字的陈述基本上是无操作的。在循环中间使用时,它们不会返回,因为它们永远不是最后执行的语句(必须执行与处理循环本身有关的其他语句)。

换句话说,隐含的返回行为只发生在函数的最后(有点过于简单,但适用于此上下文),并且您需要在其他地方使用return关键字。

答案 1 :(得分:2)

行为没有改变,在这种情况下你必须使用return true

但是你可以通过重构你的方法来避免明确的回报:

def is_to_receiver?(email_address)
  Array(@raw_email.to).include? email_address
end