这是一段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以来这种行为发生了变化?欢迎任何回复!
答案 0 :(得分:3)
如果Ruby方法中没有return
语句,Ruby将返回最后执行的语句的值。否则,只有文字的陈述基本上是无操作的。在循环中间使用时,它们不会返回,因为它们永远不是最后执行的语句(必须执行与处理循环本身有关的其他语句)。
换句话说,隐含的返回行为只发生在函数的最后(有点过于简单,但适用于此上下文),并且您需要在其他地方使用return
关键字。
答案 1 :(得分:2)
行为没有改变,在这种情况下你必须使用return true
。
但是你可以通过重构你的方法来避免明确的回报:
def is_to_receiver?(email_address)
Array(@raw_email.to).include? email_address
end