Ruby的回报点是什么?


79

return和仅放置一个变量(如以下内容)有什么区别:

没有回报

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

Answers:


118

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立即退出,请考虑以下功能:

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

如果将此函数称为as last_name("Antal S-Z"),它将返回"S-Z"。如果将其称为last_name(nil),它将返回nil。如果return 没有立即中止,它将尝试执行nil.split(/\s+/)[-1],这将引发错误。


好的,很好的例子。所以return存储返回值,但让其余方法执行。等不及要使用它了。
thenengah 2011年

4
不,反之亦然:return 立即退出该方法。如果您考虑该示例,那么如果您知道一切都很好,则计算坏度将无济于事。我将编辑答案以使其更清楚。
Antal Spector-Zabusky 2011年

8
您可以使用returnbreak等不带参数的-他们会回到nil默认。
Nakilon

38

如果它是方法中要执行的最后一行,则不需要使用“返回”,因为Ruby会自动返回最后一个求值表达式。

您甚至不需要最终的“心情”,也不需要IF语句中的那些赋值。

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

puts write_code(10)

输出:

错误


37
来自非Ruby背景,该输出肯定是WTF。:)
Patrick

return可以尽早退出执行。这是工作。
Joe.wang 2014年

1
Return还可以使方法返回nil而不是最后一个求值表达式的返回值,因此有时还会在方法末尾看到不带参数的return。
garythegoat,2015年

1
@garythegoat:或者您可以简单地编写nil
Karoly Horvath'1

4

当我浏览列表时,我使用return,如果列表中的任何成员满足条件,我想退出该函数。我可以用一条语句来完成此操作:

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

在某些情况下,

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

也是一条线-在我看来,还增加了一些灵活性。例如,第一个示例假定这是方法中的唯一一行,并且无论如何我们都希望从这一点返回。但是,如果这是一项测试,以查看继续进行该方法是否安全,则第一个示例将需要以其他方式进行处理。

编辑:

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

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

我敢肯定,没有return,它可以在一行中完成,但是我不知道怎么做。

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

编辑

应该注意的是,我假设这行是在方法内部,而不是块内。


但这主要是一种风格选择,我认为在大多数情况下,您可以并且可能应该避免使用return


break在这些情况下更有用。
Nakilon

4

Ruby总是回来!最好的方法是

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

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


3

它漂亮的红宝石提供了一个很好的功能,它没有明确指定return语句,但我只是觉得,作为一种编程标准,应该始终努力在需要的地方指定“ return”语句。这有助于使来自不同背景(例如C ++,Java,PHP等)和学习ruby的人的代码更具可读性。“ return”语句不会有任何危害,因此为什么要跳过从函数返回的常规且更标准的方法。


4
“所以为什么要跳过从函数返回的常规且更标准的方式”←因为在Ruby中,省略return 常规标准。如果您看到的是return风格良好的Ruby代码,则应该是有原因的,例如早早发布。尝试将一种语言的代码样式约定应用到另一种语言,只会使经验丰富的程序员更难于保持自己的代码样式一致。
David Moles

我仍然发现自己将分号放在行尾
gdbj

Ruby Zen中的#2难道不是“隐式胜于显式”吗?;-)
马克

1

对于来自其他语言的那些人,请多加注意。假设您有一个类似于OP的函数,并且使用“最后计算的”规则来自动设置返回值:

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

假设您添加了一条调试(或记录)语句:

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

现在猜猜看。您已经破坏了代码,因为puts返回值nil现在变成了函数的返回值。

解决方案是养成始终将返回值显式地放置在最后一行的习惯,就像OP那样:

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

-1

的Unnecesarityreturn在函数的最后一行就是syntaxic糖红宝石。在大多数过程语言中,您需要使用return每种函数(在C ++中为非void)编写。


3
我不会称其为语法糖...这里的核心功能是几乎所有内容都是一种表达if语句,语句块。这就是这种表现力的原因。
Karoly Horvath'1

我同意Karoly –它不是语法糖,因为一切都是表达。
fatuhoku
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.