编辑 | 或者另一个问题,关于同一个客体主题。我可以编写自己的类定义来使以下所有操作都起作用吗?
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) 获得多少乐趣......
当用户未登录时,我希望能够使用unless @user
或除非@user.nil?
等检测它,但同时,我希望能够调用User
该对象的方法并让它们返回相同的NilClass
(ala Objective-C),因为在大多数地方这将消除对样板if @user
代码的需要,同时仍然像nil
布尔表达式一样工作。
我看到你不能 subclass 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 而只是实现会导致它在布尔表达式中为假的方法?
编辑 | 哈哈,如果你重新定义顶层,你真的会严重破坏 Ruby NilClass
......它根本停止响应任何方法调用。
>> class NilClass
>> def method_missing(meth, *args, &block)
>> self
>> end
>> end
>>
?> nil.foo
>>
?>
?> puts "here"
>> quit
>> # WTF? Close dammit!