Ruby:处理多个回报的最佳方式

时间:2012-06-12 12:51:45

标签: ruby

我在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

有多种更好/更清洁的方法可以通过多次退货来实现这一目标吗?

5 个答案:

答案 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):

  • 当id为nil时,返回值为nil
  • 当id为false时,返回值将为false
  • 当id为其他内容时,返回值将是您的IdentifierListNode对象

答案 4 :(得分:0)

现在,你将在整个地方进行零检查。

我知道这可能不会直接回答你的问题,但你应该尝试采用其他编码模式。值得一读:

How to avoid “!= null” statements in Java?