ワンライナーに戻すことはできますが、これはもう少し明確でスキミング可能であることは価値があると私が思うケースの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
オブジェクトになります