2016-12-21 5 views
0

私はちょうどここで壁にちょっと走った。 のは、私のコードは次のようなものであるとしましょう:オプション値を返す慣習的な方法は何ですか?

ここ
def foo 
    if bar 
     123 
    else 
     nil 
    end 
end 

戻り値はintまたは無記号のいずれかです。 私はoptionals(Rust、F#、Haskellのような言語)のコンセプトに慣れていて、これは本当に私を混乱させています。

私は問題なくあらゆる型の値を返すことができますが、より機能的なバックグラウンドから来て、それはちょうど間違っていると感じています。

錆では、私はOption<T>を返します。そうすれば、Someの値が返されたのか、値が返されなかったのかを簡単にテストできます(None)。ルビー/クリスタルでは、やるべきことのように思われる。

だから、ここで問題です:
私はちょうどそこにそれに対して何の役に立つ返される値とテストされていない、これは、このような場合を扱うの慣用的な方法である場合にはnilを返す必要がありますが?もしそうでなければ、どうすればよいのですか? nilを返す

+0

をので、私は私の質問を向上させることができますか? – SplittyDev

+0

私はこの質問でRubyとCrystalを混在させることは妥当だとは思わない - すべてのRubyイディオムがCrystalのイディオムであるとは限らない。 – mgarciaisaia

+0

@mgarciaisaiaそうです。この文脈ではそれほど重要ではなかったので、私は両方にタグを付けました。クリスタルには 'Nil'タイプがあり、Rubyのように感じるので、この質問は両方に当てはまると思います。 – SplittyDev

答えて

5

はい、返すnil

Rubyで奨励ベストプラクティスです。 foo.nil?

NBで確認できます。Rubyのベストプラクティスをもっと学ぶには、Gregory Brown著「Rubyベストプラクティス」を参照してください。関連ノート、言語はデフォルトで


多くの場所でnilを返すことに。たとえば、ifの式にelseブロックがない場合、elseブロックの戻り値はnilです。

bar場合nilを返します

def foo 
    123 if bar 
end 

はクリスタルnilでtruthy

+0

ありがとうございます。あなたの答えを少し拡張して、おそらくその動作を奨励する公式のRubyのドキュメントへのリンクを追加できますか?それ以外は、答えは良いです、私は数分でそれを受け入れるでしょう:) – SplittyDev

+0

@splittydev特に私が拡大してほしいことは何ですか?公式のrubyのドキュメントは、このようなベストプラクティスをカバーしていません。他のソースからそれらを学ぶことを前提としています。 RubyのベストプラクティスGregory Brown – akuhn

+0

がRubyの公式ドキュメントでこれをカバーしていない場合、あなたの答えは完全にうまくいきます。ありがとう – SplittyDev

3

ではないことは価値がないことを示すための好ましい方法であり、通常組み合わされて、あなたの例を簡素化することができます他の値は "何かが返される(T)かどうか(Nil)"という意味になります。 APIドキュメントも、これを説明し、ゼロに対処する方法はいくつか言及:あなた自身を説明してください可能性があり、クローズ有権者にhttps://crystal-lang.org/api/0.20.1/Nil.html

関連する問題