1

私はRubyで作業しており、一部またはほとんどのメソッドの最後に条件付きのreturnステートメントが必要であることがわかりました。

これが私が持っているものです:

 # <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?

最後に実行されるステートメントは、メソッドの戻り値です。がnilの場合id、ステートメントはnilと評価され、そうでない場合は、新しいIdentifierListNodeインスタンスが返されます。

于 2012-06-12T12:59:54.883 に答える
3

ダブルアンパサンド(AND演算子)を使用すると、右手が戻るので、これに対するエイドリアンの答えを短くすることができます。

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

条件の最初の部分でidの存在がチェックされるため、nilが返されます。これが最後のステートメントである場合は、Rubyで暗示されているため、「return」を完全に削除して、次のようにすることができます。

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
return (id.nil? ? nil : IdentifierListNode.new(id, ident_a_node))
于 2012-06-12T12:55:36.673 に答える
1

ワンライナーに戻すことはできますが、これはもう少し明確でスキミング可能であることは価値があると私が思うケースの1つです。これは確かに議論の余地がありますが、ルビイストと一緒に多くの異なるチームで作業した後、1行バージョンに移動すると、あなた(またはチームの別のメンバー)が見たときに潜在的な終了状態を誤解する可能性が高いと思います後でコード。

私は提案します:

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

しばらくの間ルビーで働いたことがあるほとんどの人は、メソッドの最終値が暗黙的に返されることを理解しています(つまり、事前に返されない場合、これはnilを返します)-そしてあなたはそれを一目で見ることができます。私の経験では、長い間ルビーを扱ってきた多くの人々は、&&のバリエーションとあまり明確でない条件付きリターンにまだつまずきます。

ワンライナーを使用することに決めた場合は、ライアンの答えを使用します。これは主に、かなり一般的に使用され、混乱する可能性が低いイディオムだからです。

def ident_list(keys)
  id = nil
  ident_a_node = nil

  ## method hidden

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

このアプローチの1つの注意点は、実際には2つではなく3つの可能な戻り状態になることです(他のオプションはnilまたはnewのみを返しますIdentifierListNode)。

  • idがnilの場合、戻り値はnilになります
  • idがfalseの場合、戻り値はfalseになります
  • idがそれ以外の場合、戻り値がIdentifierListNodeオブジェクトになります
于 2012-06-12T15:44:05.383 に答える
0

現状では、いたるところにゼロチェックを行うことになります。

これはあなたの質問に直接答えないかもしれませんが、他のコーディングパターンを採用するようにしてください。読む価値があります:

Javaで「!= null」ステートメントを回避するにはどうすればよいですか?

于 2012-06-12T13:00:17.973 に答える