作爲一個實驗,我寫了一些代碼,看起來像紅寶石初始化實例變量以外的方法
class MyClass
@var = 100
def hello
p "hello"
end
end
我知道,如果我這樣做MyClass.new
是@var
沒有那個對象上定義的,而我認爲這將定義@var
在類MyClass
上。
這是否有實際用法?
作爲一個實驗,我寫了一些代碼,看起來像紅寶石初始化實例變量以外的方法
class MyClass
@var = 100
def hello
p "hello"
end
end
我知道,如果我這樣做MyClass.new
是@var
沒有那個對象上定義的,而我認爲這將定義@var
在類MyClass
上。
這是否有實際用法?
它確實有一個用途:類變量。正常的Ruby類變量實現,@@
,股超類及其子類之間的相同的變量:
class A
@@v = 0
def self.v; @@v; end
def self.v=(val); @@v=val; end
end
class B < A; end
A.v #-> 0
A.v= 3 #-> 3
B.v #->3
B.v= 42 #-> 42
A.v #-> 42
顯然,這是沒什麼用(除了事實是,與類的實例變量,類變量也可以通過實例方法直接訪問,而不是通過self.class
)。但與類的實例變量相同的例子:
class A
@v = 0
def self.v; @v; end
def self.v=(val); @v=val; end
end
class B < A; end
A.v #-> 0
A.v= 3 #-> 3
B.v= 42 #-> 42
A.v #-> 3
此外,類的實例變量可以利用所有已爲實例變量寫的元編程的,就像這樣:
class Foo
class << self
attr_accessor :v #Uses a class instance variable
end
end
如果您爲@var
MyClass.singleton_class.class_eval { attr_accessor :var }
存取方法,那麼你可以把@var
像類變量。區別在於它不會被MyClass
的子類繼承。
_why利用這個在Dwemthy's Array。
你的第二個例子是行不通的,怎麼你會在類接收器上調用實例方法嗎? – kamal 2015-10-28 16:49:50
@kamal:哎呦。固定! – Linuxios 2015-10-28 19:55:21