0

MyClassクラスのインスタンスを偽の値に評価させようとしています。MyClassそこで、私は、として機能させるために考えられるすべてのメソッドをオーバーライドしようとしましnilた。私が得た:

a = MyClass.new
a.nil? #=> true
a.class #=> NilClass
a == nil #=> true
a.eql? nil #=> true
a.equal? nil #=> true
a.instance_of? NilClass #=> true
a.kind_of? NilClass #=> true
a.is_a? NilClass #=> true

私も

nil == a #=> true
nil.eql? a  #=> true
nil.equal? a #=> true

最後に試してみました

a.__id__ #=> 4
nil.__id__ #=> 4
a.object_id #=> 4
nil.object_id #=> 4

しかし、それでも、a常にに評価されtrueます。aだから私はRubyがどのようにであるnilかをチェックするのか疑問に思いfalseました。開発者がアクセスできないものだと思います。

これは実際の問題を解決するためのものではなく、実際に解決できないのではないかと思っています。これがRubyの「everything-ist-true-except-false-and-nil」イディオムを破るだろうと私は知っています、そしてそれはおそらく純粋に邪悪なハックでしょう。

4

2 に答える 2

1

偽と評価されるオブジェクトは 2 つだけです。Ruby は、オブジェクトがこれら 2 つのいずれかであるかどうかを単純にチェックします。限目。

オブジェクト指向の基礎の 1 つはシミュレーションであることに注意してください。オブジェクトは別のオブジェクトをシミュレートできます。nilこれはここでは当てはまりません:またはをシミュレートすることは不可能falseです。これは、Ruby が OO に違反する厄介なケースの 1 つであり、Object#equal?.

于 2013-02-22T17:05:18.427 に答える
1

Ruby は式の実際のをチェックします。

class Foo; end

f = Foo.new
f # => #<Foo:0x007ff3da88b348>

if f
  puts 'yay'
else
  puts 'nay'
end

Fooクラスでどのメソッドを再定義しようとしてfも、インスタンスのままでFooあり、そのチェックは「yay」を出力します。ここでできることは何もありません。

于 2013-02-22T17:04:54.743 に答える