1

Ruby のオンライン リソースの 1 つから、次のステートメントを見つけました。

特別なオブジェクト nil は、確かにオブジェクトです (これは、NilClass というクラスの唯一のインスタンスです)。しかし実際には、それは一種の非オブジェクトでもあります。nil のブール値は false ですが、それは非オブジェクト性の始まりにすぎません。

他のオブジェクトと同様に、次のようにメソッド呼び出しにnil応答しますが、non-objectness著者が言おうとしたことは次のとおりです。

nil.to_s #=> ""
nil.to_i #=> 0
nil.object_id #=> 4
nil.inspect #=> "nil"

の哲学を理解するためにここで私を助けてくれる人non-object-nessはいnilますか?

4

1 に答える 1

0

nilnullは他の言語と同等です。通常、null正常な値として扱われるべきではありません。

ただし、お気づきかもしれませんが、Ruby 言語の構文は、オブジェクトのメソッド呼び出しに関するあらゆることを行います。Python よりもはるかに多くのことを行います。価値観の健全性を判断することは、その一部です。

次の例を考えてみましょう

def foobar(arg)
  if arg < 1
    return nil
  else
    return "Oh, hi!"
  end
end

res = foobar(rand(2))
puts res unless res.nil?

nil?ご覧のとおり、最後の行では、メソッドを呼び出して結果が nil であることを確認しています。これは、比較演算子がオーバーロードされる可能性があり、非常に異なることを実行できるため、最も効果的な方法です。は、値を次のように処理できる場合nil?にのみ戻ります(通常、値が nil の場合 - ただし、メソッドは非常に推奨されていなくてもオーバーライド可能です。開発者は通常、このメソッドをオーバーライドしません)。truenilnil?

もう 1 つの便利なプロパティはメソッドをnil持っているため、空の文字列を返すことができます。to_sx = "#{nil}

オブジェクトnilではない場合、nil?その上で他の便利な関数を呼び出すことはできませんが、Java のような NullPointerException や C/C++ のようなセグメンテーション違反に直面する可能性があります。そして通常、それは無意味です。

于 2013-03-10T07:06:32.590 に答える