2011-08-31 43 views
1
class Person 
    def name 
    puts "Doharey" 
    end 
end 

puts Person.class #=> this out puts Class 
puts Class.methods.count #=> 82 methods 
puts Person.methods.count #=> 82 methods 

在上述例子中一個Person類被創建從Class繼承和兩個PersonClass具有方法相等數目。是否認爲方法在ruby中缺失是可疑的?

現在讓我們來實例化Person

a = Person.new 
puts a.methods.count #=> 42 methods 

如果a是那麼爲什麼在aPerson少的方法的數量Person一個實例。怎麼了 ?一些方法如何失蹤?它們不是首先被遺傳的嗎?如果是這樣如何?

+0

您的Person類不從Class繼承,而是從Object繼承。 –

+0

「認爲方法在紅寶石中缺失是否可疑?」你有沒有檢查過'Kernel#method_missing'? [對不起,只是忍不住。] –

+0

什麼是'Kernel#methods_missing'? 「[對不起,只是無法抗拒]」=>沒有得到你,什麼? – pankajdoharey

回答

2
a.methods 

是實例方法和

Person.methods 

是類方法。他們不共享相同的命名空間。當您在Person上定義name時,您正在定義一個實例方法。

class Person 
    def self.name 
    puts "Doharey" 
    end 
end 
=> nil 
Person.methods.count 
=> 113 
Class.methods.count 
=> 114 

這裏我定義了一個類方法,它也出現在方法列表中。

+0

這就是我首先想到的,按照定義,一個對象不能有類方法。而類方法只能從無實際的類中調用,而不能用於類的實例。但'Person'類本身是'Class'類的一個實例,實際上'Person'是一個對象。這是矛盾的。 – pankajdoharey

+1

也有關,'Person.instance_methods'返回實例方法的列表,所以'Person.instance_methods.count' == == Person.new.methods.count' –

+0

如果是這樣的情況如何來的一些方法存在於: 'Person.instance_methods'也出現在'Person.methods' 當你說'Person.methods'給出了一個類方法列表,並且'Person.instance_methods'給出了一個實例方法列表。 類方法不應該出現在實例中。那麼怎麼來像'inspect','object_id'等....都出現在這兩個列表中? – pankajdoharey

1
class Person 
    def name 
    puts "Doharey" 
    end 
end 

在我們的新類中有多少個實例方法?

Person.instance_methods.size 
# => 72 

列表中的一個類的所有實例方法,但不包括從超類繼承的任何方法:

Person.instance_methods(false) 
# => [:name] 

每一個新的類是默認對象的一個​​子類:

Person.superclass 
# => Object 

多少超類中有實例方法嗎?

Object.instance_methods.size 
# => 71 
相關問題