2011-11-08 23 views
2

我對以下想法是否正確?忠告/反饋非常感謝!所有的類方法都是用「def self.foo」定義的嗎?


我們可以知道哪些方法是實例方法和方法是類方法,通過該關鍵字self已經在方法名前指定看到。

因此,該方法,例如:def self.foo_bar被定義爲類方法。 另一方面,def foo_bar被定義爲實例方法。

+0

怎麼樣蘋果類; def Apple.eat;結束;結束?並使用'instance_methods()'? – Zabba

+0

@ muistooshort,我同意,刪除了我的誤導評論。爲失蹤這個案子道歉! – aishwarya

回答

4

不,你不能那樣做。試想一下:

class C 
    class << self 
    def m 
     puts 'pancakes!' 
    end 
    end 
    def i 
    puts 'eggs' 
    end 
end 

這讓你在C一個類的方法m與方法的聲明沒有「自我」。你可以,但是,請類關於它的方法:

C.methods.include? :m 
# true 
C.methods.include? :i 
# false 
C.instance_methods.include? :i 
# true 

並給予Ruby的類如何可變的是,要求類是可以肯定的唯一途徑。

1

有更多的方式在類定義來定義類方法除了方法與self.

class A 
    def A.method1 
    end 

    class << self 
    def method2 
    end 
    end 
end 

A.instance_eval do 
    def method3 
    end 
end 

module B 
    def method4 
    end 
end 

A.extend B 

p A.methods.first(4) 

# >> [:method1, :method2, :method3, :method4] 
+0

+1用於添加更多方法。 –

0

作爲另一種選擇,你可以看到你所有的類方法在這個片段中的幫助:

class C 
    class << self 
    def first 
    end 
    end 
    def C.second 
    end 
    def self.third 
    end 
end 

eigenclass = class << C; self; end 
eigenclass.instance_methods(false) # => [:first, :second, :third] 

這是因爲所有的類方法都是這個Class'es對象的特徵類的實例方法。

相關問題