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