实例方法在哪里来自数字1

时间:2015-06-23 04:49:04

标签: ruby class

数字1包含109个附加方法,超出了它继承的Fixnum类。

1.methods - Fixnum.methods => [:%, :&, :*, :**, :+, :+@, :-, :-@, ...]
(1.methods - Fixnum.methods).count => 109 
1.is_a? Fixnum => true

因此,根据我的理解,我会说数字1Fixnum的一个实例。但为什么数字1的方法比Fixnum多得多?它们来自哪里?我如何为数字1编写我自己的方法?

6 个答案:

答案 0 :(得分:2)

当您致电.methods时,它会在该实例上提供定义的方法。因此,当您要求Fixnum.methods时,您可以获得可以在Fixnum 上调用的方法,而不是Fixnum类型的对象。

关于你的上一个问题,Ruby允许你像这样扩展一个类:

class Fixnum
  def plus9
    return self + 9
  end
end

答案 1 :(得分:1)

它们可以来自Fixnum的父类以及沿途混合的任何模块。您可以使用1.method('<method name>').inspect找出该方法的确切来源。

method#source_location也很好,但它不适用于本地方法,几乎​​是1上的所有方法。

答案 2 :(得分:1)

Fixnum本身是Class的一个实例,当您调用Fixnum.methods时,它会返回Class类及其祖先所拥有的方法。

因此,当你比较1.methods - Fixnum.methods类的方法和Fixnum类的方法时,Class没什么意义。

Fixnum.class
# => Class
1.class
# => Fixnum
  

我如何为数字1编写自己的方法

您可以在Fixnum或其任何祖先类中实现自己的方法:IntegerNumeric等,具体取决于此方法有意义的类。

答案 3 :(得分:1)

您可能会误解Object#methods方法。

  1. 根据Ruby API,

      

    方法(regular = true)→返回obj的公共和受保护方法的名称列表。

  2. 所以Fixnum.methods从对象的角度返回方法,而不是类。

  3. Module#instance_methods就是你想要的

    1.methods.count == Fixnum.instance_methods.count # => true
    
  4. 要在Ruby中获取正确的方法列表是一件令人困惑的事情,Idiosyncratic Ruby有一篇关于method-lists的详细帖子。它帮助我解决问题,并希望这也可以帮助你。

答案 4 :(得分:0)

扩展Fixnum类并添加/修改自己的方法。您可以使用以下代码:

class Fixnum
     def newNum_method
         puts self.methods
     end
end

您也可以用同样的方法修改现有方法。很多时候&#39; to_s&#39;被修改以产生特定结果,例如:

class Array
     def to_s
         puts self.join(":")
     end
 end

此代码仅修改您指定的内容。 您还可以添加特定于类的代码,例如:

def Array.newMethod
      puts Array.methods
end

这允许您致电:

puts Array.newMethod

(技术上与&#34相同;放置Array.methods&#34;) 但你可以自定义这个来说或做任何关于&#39;数组&#39;类

您甚至可以为Fixnum类创建一个方法来迭代其父项并从中列出EACH方法。

def Fixnum.listParentMethods
      .....
end

答案 5 :(得分:0)

尝试

1.methods - Fixnum.instance_methods

你会得到一个空数组。

在ruby中,类是 Class 类型的对象 当您致电obj.methods时,它会返回obj的所有公开方法 那么如果obj是一个类呢?