【问题标题】:What monkeypatch creates the private method split?什么猴子补丁创建了私有方法拆分?
【发布时间】:2011-04-18 00:15:30
【问题描述】:

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

这个私有的split 方法是猴子补丁的伪关键字(如print 和puts)吗?如果是这样,添加了什么,为什么他们使用 String 已经存在的方法名称?

【问题讨论】:

  • print 和 puts 不是“伪关键字”。它们只是方法。我不熟悉将#split 添加到 NilClass 的任何 gem 或库,因此我无法直接对此发表评论。也许你可以做一些取证来找出什么库是猴子修补 NilClass 来添加一个私有的#split 方法(这很奇怪)。
  • split 来自内核,如 DigitalRoss 注释。然后,据推测,Fixnum 和 NilClass 提供了它们自己的私有覆盖,实质上是从它们的接口中删除 split。
  • @mu 太短了:噢!不知道为什么我没有注意到 - 也许它是在我已经阅读了那个问题之后发布/添加的。我应该只是关闭问题,还是删除它?
  • 关闭或删除它并将其归咎于周日宿醉 :) 或者我可以使用一些代码发布答案,以便我们可以解决缩进问题。
  • @mu 太短:不需要 - 我刚刚获得了复制编辑器徽章!

标签: ruby monkeypatching


【解决方案1】:

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

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

您可以从我的Ruby Method Lookup Flow (PDF 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>'

【讨论】:

    猜你喜欢
    • 2012-12-12
    • 2012-08-19
    • 1970-01-01
    • 2019-09-07
    • 2012-07-26
    • 1970-01-01
    • 2016-09-01
    • 2012-09-16
    • 2012-12-18
    相关资源
    最近更新 更多