我发现自己要做很多事情来定义ruby方法的返回值:
def foo
val = (some expression)
val
end
这似乎有点做作。这里最好的做法是什么?
答案 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)
我有时会在你的问题中做你所拥有的。
我做的一些情况是:
foo = Foo.new; foo.modify_state; foo
)Object#tap
可以在这里提供帮助(foo = new_foo; raise if foo.empty?; foo
)do_this; do_that; do_other_thing; result #done!
)它可能表示代码有异味,例如情况1。