Ruby: Private method called for 3:Fixnum和private method `split' called for nil:NilClass (NoMethodError) 问题分别提到split
了Fixnum
和NilClass
对象的私有方法。
这个私有split
方法是一个猴子补丁的伪关键字(比如print
and puts
)吗?如果是这样,添加了什么,为什么他们使用已经存在的方法名称String
?
Ruby: Private method called for 3:Fixnum和private method `split' called for nil:NilClass (NoMethodError) 问题分别提到split
了Fixnum
和NilClass
对象的私有方法。
这个私有split
方法是一个猴子补丁的伪关键字(比如print
and puts
)吗?如果是这样,添加了什么,为什么他们使用已经存在的方法名称String
?
您可以自己解决这个问题(即使不阅读其他答案):
ruby-1.8.7-p330 :001> 3.method(:split)
#=> #<Method: Fixnum(Kernel)#split>
您可以从我的Ruby 方法查找流程(PDF 版本)中看到,所有对象的方法都在Object
……的实例方法处结束,它本身包括Kernel
. 因此,所有实例方法Kernel
(添加了许多可用作顶级便利方法的案例)也最终成为每个对象的方法。
请注意,这在 1.9+ 中并非如此,因为Kernel#split
已删除:
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>'