ruby方法返回值的最佳实践

时间:2010-11-18 15:33:33

标签: ruby

我发现自己要做很多事情来定义ruby方法的返回值:

def foo
  val = (some expression)
  val
end

这似乎有点做作。这里最好的做法是什么?

6 个答案:

答案 0 :(得分:11)

除非(某些表达式)很重并且将被多次调用,否则不必将其保存到变量中。在这种情况下,您可能想要缓存它。

我会选择:

def foo
  (some expression)
end

或用于缓存:

def foo
  @val ||= (some expression)
end

答案 1 :(得分:9)

请注意,从Ruby 1.9开始,如果在返回之前需要对值执行其他操作,可以使用Object#tap为结尾保存返回值

def foo
  (some expression).tap do |val|
    # use val here
  end
  # The return value of the tap is _val_
  # and hence the return value of your method
end

答案 2 :(得分:1)

只要您的最后一个表达式评估为您想要返回的所需表达式,您就是安全的。

def foo
  val = (some expression)
end

与问题中的那个相同,因为它评估为(some expression),就像val一样。

答案 3 :(得分:1)

临时变量是邪恶的,因为它们会增加灵感。

http://www.mgroves.com/what-is-connascence

ReplaceTempWithQuery是我经常使用的重构:

def discount_price
  base_price = quantity * item_price
  if (base_price > 1000)
    base_price * 0.95
  else
    base_price * 0.98
  end
end

重构后的代码:

def discount_price
  if (base_price > 1000)
    base_price * 0.98
  else
    base_price * 0.98
  end
end

def base_price
  quantity * item_price
end

http://www.refactoring.com/catalog/replaceTempWithQuery.html

答案 4 :(得分:1)

我个人喜欢使用返回来明确调出返回的内容。这是Ruby不需要你使用的额外代码,但它有助于我提高可读性。它还允许您在方法中有多个退出点,因为一旦调用return,方法的执行就会停止。

这与你在原始问题中给出的例子没什么不同。

def foo
  val = (some expression)
  val
end

可能看起来像

def foo
  return (some expression)
end

答案 5 :(得分:1)

我有时会在你的问题中做你所拥有的。

我做的一些情况是:

  1. 当我进行不完整的编程(foo = Foo.new; foo.modify_state; foo
  2. 如果我想在返回之前验证对象,但正如Phrogz所提到的那样,Object#tap可以在这里提供帮助(foo = new_foo; raise if foo.empty?; foo
  3. 当我想明确表示我正在返回一个变量时,而不是做更多的事情(do_this; do_that; do_other_thing; result #done!
  4. 它可能表示代码有异味,例如情况1。