1

ここでちょっと壁にぶち当たりました。私のコードが次のようなものだとしましょう:

def foo
    if bar
        123
    else
        nil
    end
end

ここで、戻り値は Int または Nil のいずれかです。私はオプションの概念 (Rust、F#、Haskell などの言語) に慣れていますが、これには本当に混乱しています。

問題なく任意の型の値を返すことができることを認識していますが、より機能的なバックグラウンドから来ると、それは間違っているように感じます.

Rust では、Option<T>. Someそうすれば、値が返されるか、値が返されないか ( ) を簡単にテストできますNone。ただし、Ruby/Crystal では、これはばかげたことのように思えます。

それで、ここに質問があります:返してそれに対してテストする有用な値がない場合、
私はただ返す必要がありますか?これはそのようなケースを処理する慣用的な方法ですか? nilそうでない場合、どのように慣用的な方法でそれを行うべきですか?

4

2 に答える 2

5

はい、戻りますnil

戻るnilことは、Ruby で推奨されるベスト プラクティスです。あなたはそれをチェックすることができますfoo.nil?

注: Ruby のベスト プラクティスをさらに学びたい場合は、Gregory Brown 著の書籍「Ruby Best Practices」を参照してください。


関連する注意事項として、言語はデフォルトnilで多くの場所で返されます。たとえば、if式に else ブロックがない場合、else ブロックの戻り値は ですnil

したがって、例を次のように単純化できます

def foo
  123 if bar
end

が真実でないnil場合に返されるbar

于 2016-12-21T22:44:38.497 に答える
3

Crystalnilでは、値が存在しないことを示すための推奨される方法であり、通常は他の値と組み合わせて、「何かを返す ( T) か返さない ( Nil)」ことを意味します。API ドキュメントもこれを説明し、nil を処理するいくつかの方法について言及しています: https://crystal-lang.org/api/0.20.1/Nil.html

于 2016-12-22T10:50:26.570 に答える