編集 | または、同じオブジェクトの件名に関する別の質問。次のすべてを機能させる独自のクラス定義を作成できますか?
o = WeirdObject.new
puts "Object o evaluates as true in boolean expressions" if o # Line never output
puts "Object o is nil?" if o.nil? # Line is output
nil?
それは単なる方法なので、簡単にできます。しかし、ブール式(最も基本的な式「o」のみを含む)で真ではない値として評価する方法がわかりません。
元の質問は次のとおりです...
Ruby (1.9.2) でどれだけ楽しめるかという好奇心から...
ユーザーがログインしていないときは、with unless @user
or until@user.nil?
などで検出できるようにしたいのですが、同時に、このオブジェクトのメソッドを呼び出してUser
同じものを返してもらいたいです(ala Objective-C)。ほとんどの場合、これによりボイラープレートコードNilClass
が不要になるため、ブール式のように動作します。if @user
nil
NilClass
メソッドがないため、サブクラス化できないことがわかりました#new
。メソッドをインスタンスに直接追加できますが、これはシングルトンであるため、この動作を確認したい場所がログインしていないユーザーだけである場合、問題が発生します。
出来ますか?
つまり、次のようなものです。
class CallableNil < NilClass
def method_missing(meth, *args, &block)
self
end
end
user = CallableNil.new # or .singleton, or something
puts "Got here" unless user # Outputs
puts "And here" unless user.nil? # also outputs
puts user.username # no-op, returns nil
これは基本的に Objective-C が nil を処理する方法であり、状況によっては便利です。
NilClass をサブクラス化できず、ブール式で false になるメソッドを実装できなかったと思いますか?
編集 | ははは、トップレベルを再定義すると、本当にRubyがかなり壊れてしまいますNilClass
...メソッド呼び出しにまったく応答しなくなります。
>> class NilClass
>> def method_missing(meth, *args, &block)
>> self
>> end
>> end
>>
?> nil.foo
>>
?>
?> puts "here"
>> quit
>> # WTF? Close dammit!