monkeypatch创建私有方法拆分的是什么?

时间:2011-04-18 00:15:31

标签: ruby monkeypatching

问题Ruby: Private method called for 3:Fixnumprivate method `split' called for nil:NilClass (NoMethodError)分别提到splitFixnum个对象的私有方法NilClass

此私有split方法是monkeypatched伪关键字(如printputs)吗?如果是这样,添加了什么,为什么他们使用String已经存在的方法名称?

1 个答案:

答案 0 :(得分:1)

你可以自己解决这个问题(即使没有阅读其他答案):

ruby-1.8.7-p330 :001> 3.method(:split)
#=> #<Method: Fixnum(Kernel)#split> 

您可以在我的Ruby Method Lookup FlowPDF version)中看到所有对象的方法都在Object的实例方法中完成...其本身包含Kernel。因此,Kernel的所有实例方法(添加了许多可用作顶级便捷方法的实例)也最终成为每个对象的方法。

请注意,由于Kernel#split已删除,因此在1.9+中不是这样:

ruby-1.9.1-p378 :001> 3.method(:split)
#=> NameError: undefined method `split' for class `Fixnum'
#=>     from (irb):1:in `method'
#=>     from (irb):1
#=>     from /Users/phrogz/.rvm/rubies/ruby-1.9.1-p378/bin/irb:16:in `<main>'