Ruby中的返回点是什么?

时间:2011-01-05 06:42:48

标签: ruby return

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

7 个答案:

答案 0 :(得分:112)

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

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

答案 1 :(得分:37)

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

您甚至不需要最终的“情绪”,也不需要在IF语句中进行这些任务。

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

puts write_code(10)

输出:

  

ERROR

答案 2 :(得分: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

答案 3 :(得分:4)

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

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

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

答案 4 :(得分:3)

它漂亮的ruby给出了这个不明确指定return语句的优点,但我觉得,作为编程标准,应该始终努力在需要的地方指定“return”语句。这有助于使代码对于来自不同背景的人(如C ++,Java,PHP等)和学习ruby更具可读性。 “return”语句不会伤害任何东西,所以为什么要跳过传统的,更标准的函数返回方式。

答案 5 :(得分:0)

对于来自其他语言的警告,请谨慎行事。假设您有一个类似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

答案 6 :(得分:-1)

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