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

时间:2012-03-17 03:50:21

标签: ruby null

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

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

两个问题

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

  2. 如果我只修补nil对象为missing_methods返回nil会发生什么样的可怕事情?

  3. IE:

    class NilClass
      def missing_method
        nil
      end
    end
    

2 个答案:

答案 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)