我在Ruby工作,并且发现需要在我的一些/大部分方法结束时使用条件返回语句。
这就是我所拥有的:
# <ident-list> -> [ident] <ident-A>
def ident_list(keys)
id = nil
ident_a_node = nil
## method hidden
return IdentifierListNode.new(id, ident_a_node) unless id.nil?
return nil
end
有多种更好/更清洁的方法可以通过多次退货来实现这一目标吗?
答案 0 :(得分:5)
end
之前的最后一行可以简单地
IdentifierListNode.new(id, ident_a_node) unless id.nil?
执行的最后一个语句是方法的返回值。如果id
为nil,则语句将评估为nil,如果不为,则返回新的IdentifierListNode实例。
答案 1 :(得分:3)
当使用双&符号(AND操作符)时,右手将返回,因此您可以缩短Adrian对此的答案:
return (id && IdentifierListNode.new(id, ident_a_node))
当条件的第一部分检查是否存在id时,将返回nil。如果这是最后一个语句,你可以完全删除“return”,因为它隐含在Ruby中,只留下:
id && IdentifierListNode.new(id, ident_a_node)
测试以下内容:
def check(input)
input && input * 2
end
check(nil) # => nil
check(123) # => 246
答案 2 :(得分:1)
return (id.nil? ? nil : IdentifierListNode.new(id, ident_a_node))
答案 3 :(得分:1)
虽然你可以回归单行,但这是其中一种情况,我认为更明确一点,并且可以使用它是值得的。这当然值得商榷,但是在与rubyists合作的很多不同团队之后,我认为如果你去一个单一版本,那么你(或你的团队的另一个成员)很可能会在看到潜在的退出状态时误解代码稍后。
我建议:
def ident_list(keys)
id = nil
ident_a_node = nil
## method hidden
return IdentifierListNode.new(id, ident_a_node) unless id.nil?
nil
end
或者如果你不关心这种情况下false / nil之间的区别,那就更好了:
def ident_list(keys)
id = nil
ident_a_node = nil
## method hidden
return IdentifierListNode.new(id, ident_a_node) if id
nil
end
几乎所有曾在ruby工作过一段时间的人都知道方法中的最终值被隐式返回(即如果事先没有返回则返回nil) - 你可以一眼就看出来。我的经验是,许多长期使用红宝石的人仍然因为&amp;&amp;和并且不太明确的条件回报。
如果你决定使用单行,我会选择Ryan的答案,主要是因为它是一种习惯用法相当普遍且不太可能混淆:
def ident_list(keys)
id = nil
ident_a_node = nil
## method hidden
id && IdentifierListNode.new(id, ident_a_node)
end
这种方法的一个警告是,您实际上最终得到三个可能的返回状态而不是两个(其他选项只会返回nil或您的新IdentifierListNode
):
IdentifierListNode
对象答案 4 :(得分:0)