Ruby中的回报点是什么?

return和只是把一个variables如下所示之间的区别是什么:

没有回报

 def write_code(number_of_errors) if number_of_errors > 1 mood = "Ask me later" else mood = "No Problem" end mood end 

返回

 def write_code(number_of_errors) if number_of_errors > 1 mood = "Ask me later" else mood = puts "No Problem" end return mood end 

return可以让你早日脱离:

 def write_code(number_of_errors) return "No problem" if number_of_errors == 0 badness = compute_badness(number_of_errors) "WHAT?! Badness = #{badness}." end 

如果number_of_errors == 0 ,那么"No problem"将立即返回。 但是,在方法结束时,正如你所观察到的那样,这是不必要的。


编辑:为了演示return立即退出,请考虑此function:

 def last_name(name) return nil unless name name.split(/\s+/)[-1] end 

如果你把这个函数叫做last_name("Antal SZ") ,它将返回"SZ" 。 如果你把它叫做last_name(nil) ,它将返回nil 。 如果return 立即中止,它会尝试执行nil.split(/\s+/)[-1] ,这将引发错误。

如果是方法中的最后一行,使用“return”是不必要的,因为Ruby会自动返回最后一个计算的expression式。

你甚至不需要最后的“心情”,也不需要在IF声明中的这些任务。

 def write_code(number_of_errors) if number_of_errors > 1 "ERROR" else "No Problem" end end puts write_code(10) 

输出:

错误

Ruby总是返回! 最好的办法是

 def write_code(number_of_errors) (number_of_errors > 1)? "ERROR" : "No Problem" end 

这意味着如果number_of_errors> 1它将返回错误否则没有问题

当我正在浏览一个列表时,我使用return,并且如果列表中的任何成员满足条件,我想退出该函数。 我可以用一个单一的陈述来完成这个工作

list.select{|k| k.meets_criteria}.length == 0

在某些情况下,但是

list.each{|k| return false if k.meets_criteria}

也是一条线 – 在我看来,有一些增加了灵活性。 例如,第一个例子假设这是该方法中唯一的一行,而且无论如何我们都希望从这一点返回。 但是,如果这是testing是否可以安全地继续执行其余的方法,那么第一个示例将需要以不同的方式处理这个问题。

编辑:

为了增加一些灵活性,请考虑以下代码行:

list_of_method_names_as_symbols.each{|k| list_of_objects.each{|j| return k if j.send(k)}}

我确信这可以在一行中完成,而不会有任何return ,但是我的头顶我不明白。

但是现在这是一个相当灵活的代码行,可以用任何布尔方法列表和实现这些方法的对象列表来调用。

编辑

应该指出,我假设这条线是在一个方法,而不是一个块。


但这主要是一种风格的select,我认为在大多数情况下,你可以也可能应该避免使用return

它的好的ruby提供了这个不明确指定return语句的好处,但我只是觉得,作为一个编程标准,应该总是努力在任何需要的地方指定“return”语句。 这有助于使代码对于来自不同背景(如C ++,Java,PHP等)和学习Ruby的人员更具可读性。 “返回”语句不会损害任何东西,那么为什么跳过常规和更标准的函数返回的方式。

在函数的最后一行return不相干只是Ruby的syntaxic糖 。 在大多数过程语言中,您需要在每个函数中写入return (在C ++中为非void)函数。