標籤:
首先,methods,private_methods是Object類的執行個體方法;instance_methods是Module類的執行個體方法。
我們先來看看這樣安排的原因:
我們知道一個Ruby對象所能調用的方法包含在其祖先鏈中(包含這個對象的單例類).這裡所說的Ruby對象可以分為2類,一類是普通對象,像"abc",2,obj=Object.new這種對象,它們所屬的類分別是String,Fixnum,Object,我們稱這種對象為普通對象;還有一類對象是類(類本身也是一種對象),像String,Class這種類,也是對象,它們所屬的類都是Class,我們稱這種對象為類對象。
普通對象的祖先鏈,以"abc"為例,為String-> Comparable->Object->Kernel-> BasicObject
類對象的祖先鏈,以String為例,為Class->Module->Object->Kernel-> BasicObject
我們可以看到普通對象是沒有instance_methods方法的,因為其祖先鏈上沒有Module類。所以對於一個普通對象,我們只能說它有方法或私用方法,而不能說它有執行個體方法,執行個體方法是對一個類來說的。
類對象的祖先鏈上有Module類,所以其有instance_methods,我們也可以說類有執行個體方法。
另外,一個普通對象的methods和其所屬類的instance_methods一般是相等的。"abc".methods == String.instance_methods 因為普通對象的方法就是其所屬類的執行個體方法。
這裡說一般,是因為如果在一個普通對象的單例類中定義了一個執行個體方法,那麼普通對象的methods就會比其所屬類的執行個體方法要多。舉例如下:
obj = String.new("abc")
obj.instance_eval {
def method1
"method1"
end
}
p obj.methods == String.instance_methods //false
最後,methods方法返回的是對象的public,protected方法,所以還要有一個private_methods方法返回其private方法。
淺析Ruby中的methods,private_methods和instance_methods