我對以下想法是否正確?忠告/反饋非常感謝!所有的類方法都是用「def self.foo」定義的嗎?
我們可以知道哪些方法是實例方法和方法是類方法,通過該關鍵字self
已經在方法名前指定看到。
因此,該方法,例如:def self.foo_bar
被定義爲類方法。 另一方面,def foo_bar
被定義爲實例方法。
我對以下想法是否正確?忠告/反饋非常感謝!所有的類方法都是用「def self.foo」定義的嗎?
我們可以知道哪些方法是實例方法和方法是類方法,通過該關鍵字self
已經在方法名前指定看到。
因此,該方法,例如:def self.foo_bar
被定義爲類方法。 另一方面,def foo_bar
被定義爲實例方法。
不,你不能那樣做。試想一下:
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的類如何可變的是,要求類是可以肯定的唯一途徑。
有更多的方式在類定義來定義類方法除了方法與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]
+1用於添加更多方法。 –
作爲另一種選擇,你可以看到你所有的類方法在這個片段中的幫助:
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對象的特徵類的實例方法。
怎麼樣蘋果類; def Apple.eat;結束;結束?並使用'instance_methods()'? – Zabba
@ muistooshort,我同意,刪除了我的誤導評論。爲失蹤這個案子道歉! – aishwarya