我可以修补NilClass修复缺少方法的nil吗?

Int*_*tss 10 ruby null

在其他语言中,例如(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)

这一切似乎都是倒退和奇怪的.

两个问题

  1. 我做错了什么,处理零对象可能性的正确方法是什么

  2. 如果我只是修补了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?你可能会得到一些奇怪的副作用.


dbe*_*hur 8

要获得比我写得更全面的答案,请阅读Reg Braithwaite的The Hopelessly Egocentric Blog Post

简短的回答:有些人认为你的method_missing技巧的行为是可取的,但有一些陷阱.Ruby的设计者认为默认情况下行为不合适.其他语言设计者另有选择(例如:Objective-C)