在其他语言中,例如(objective-c),调用nil对象上的方法会无声地失败并返回nil但是在ruby中会出现这样的错误......
undefined method `some_method' for nil:NilClass
(对我来说)产生如下代码:
if some_object && some_object.cool? # instead of if some_object.cool?
# do some cool stuff
end
或
some_object.do_awsome_thing if some_object
这一切似乎都是倒退和奇怪的。
我做错了什么,处理零物体可能性的正确方法是什么
如果我只修补nil对象为missing_methods返回nil会发生什么样的可怕事情?
IE:
class NilClass
def missing_method
nil
end
end
答案 0 :(得分:10)
这是一个设计选择,我想我可以nil
回复nil
对它不知道的方法。
为了保持一致,您应该定义respond_to_missing?
:
class NilObj
def method_missing(*_)
nil
end
def respond_to_missing?(*_)
true
end
end
如果你像你建议的那样做了猴子补丁method_missing
,特别是如果你也相应地重新定义respond_to_missing?
,你可能会得到一些奇怪的副作用,因为鸭子打字需要一些内省,而这通常是通过检查来完成的如果一个对象响应的东西而不是一个特定的类。
例如,nil
会响应to_ary
这一事实似乎表明它是"类似数组",当情况并非如此时。
一些内置方法会调用respond_to?
,有些会简单地调用和解救NoMethodError
,所以即使没有respond_to_missing?
你也可能会产生一些奇怪的副作用。
答案 1 :(得分:8)
要获得比我能写的更全面的答案,请阅读Reg Braithwaite的The Hopelessly Egocentric Blog Post
简短的回答:有些人认为你的method_missing技巧的行为是可取的,但有一些陷阱。 Ruby的设计者认为默认情况下行为不合适。其他语言设计者另有选择(例如:Objective-C)