1

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

有没有更好/更清洁的方法来解决这个问题?

4

5 回答 5

5

之前的最后一行end可以简单

IdentifierListNode.new(id, ident_a_node) unless id.nil?

最后执行的语句是方法的返回值。如果id为 nil,则该语句将评估为 nil,如果不是,则将返回新的 IdentifierListNode 实例。

于 2012-06-12T12:59:54.883 回答
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
于 2012-06-12T13:02:46.353 回答
1

虽然您可以将返回单线,但这是我认为更明确和可略读的情况之一是值得的。这当然值得商榷,但在与 ruby​​ists 合作过很多不同的团队之后,我认为如果你使用单行版本,那么你(或团队的其他成员)很有可能在查看时误解了潜在的退出状态后面的代码。

我建议:

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) - 你可以一目了然。我的经验是,许多长期使用 ruby​​ 的人仍然会被 && 的变化和不太明确的条件返回所困扰。

如果您决心使用单线,我会选择 Ryan 的回答,主要是因为它是一个相当常用且不太可能混淆的成语:

def ident_list(keys)
  id = nil
  ident_a_node = nil

  ## method hidden

  id && IdentifierListNode.new(id, ident_a_node)
end

这种方法的一个警告是,您实际上最终得到了三种可能的返回状态而不是两种(其他选项只会返回 nil 或您的 new IdentifierListNode):

  • 当 id 为 nil 时,返回值为 nil
  • 当 id 为 false 时,返回值为 false
  • 当 id 是其他任何东西时,返回值将是您的IdentifierListNode对象
于 2012-06-12T15:44:05.383 回答
1
return (id.nil? ? nil : IdentifierListNode.new(id, ident_a_node))
于 2012-06-12T12:55:36.673 回答
0

就目前而言,您将在所有地方进行零检查。

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

如何避免 Java 中的“!= null”语句?

于 2012-06-12T13:00:17.973 回答