2011-04-18 20 views
1

問題Ruby: Private method called for 3:Fixnumprivate method `split' called for nil:NilClass (NoMethodError)分別提及私人方法split對於FixnumNilClass對象。什麼monkeypatch創建私有方法拆分?

這是私人的split方法monkeypatched僞關鍵字(如printputs)?如果是這樣,那麼添加它,爲什麼他們使用String已存在的方法名?

+0

打印期權和看跌期權不是「僞關鍵字」。他們只是方法。我不熟悉任何將#split添加到NilClass的寶石或庫,所以我不能直接對此進行評論。也許你可以做一些取證,找出哪些庫是猴子補丁NilClass添加一個私人的#split方法(這很奇怪)。 – 2011-04-18 00:25:41

+2

'split'來自內核[DigitalRoss](http://stackoverflow.com/questions/5697282/ruby-private-method-called-for-3fixnum/5697293#5697293)筆記。然後,據推測,Fixnum和NilClass提供了他們自己的覆蓋,基本上,從他們的界面中刪除'split'。 – 2011-04-18 00:35:46

+0

@mu太短:D'Oh!不知道爲什麼我沒有注意到 - 也許是在我已經讀過這個問題後發佈/添加的。我應該只是關閉這個問題,或者刪除它? – 2011-04-18 01:16:27

回答

1

就可以解決這個自己(甚至沒有讀取其它答案):

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

你可以看到我的Ruby Method Lookup FlowPDF version),對所有對象的方法完成在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>' 
相關問題