数字1
包含109个附加方法,超出了它继承的Fixnum
类。
1.methods - Fixnum.methods => [:%, :&, :*, :**, :+, :+@, :-, :-@, ...]
(1.methods - Fixnum.methods).count => 109
1.is_a? Fixnum => true
因此,根据我的理解,我会说数字1
是Fixnum
的一个实例。但为什么数字1
的方法比Fixnum
多得多?它们来自哪里?我如何为数字1
编写我自己的方法?
答案 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
或其任何祖先类中实现自己的方法:Integer
,Numeric
等,具体取决于此方法有意义的类。
答案 3 :(得分:1)
您可能会误解Object#methods方法。
根据Ruby API,
方法(regular = true)→返回obj的公共和受保护方法的名称列表。
所以Fixnum.methods
从对象的角度返回方法,而不是类。
Module#instance_methods就是你想要的
1.methods.count == Fixnum.instance_methods.count # => true
要在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
是一个类呢?