我試圖從http://ruby-metaprogramming.rubylearning.com/解決鍛鍊1外部獲取值,但不知道如何從A類和它的實例得到「一個」變量。我如何從類紅寶石
下面的代碼:
class A
def initialize
@a = 11
@@a = 22
a = 33
end
@a = 1
@@a = 2
a = 3
end
我試圖從http://ruby-metaprogramming.rubylearning.com/解決鍛鍊1外部獲取值,但不知道如何從A類和它的實例得到「一個」變量。我如何從類紅寶石
下面的代碼:
class A
def initialize
@a = 11
@@a = 22
a = 33
end
@a = 1
@@a = 2
a = 3
end
當您定義此類時,輸出將是本地作用域變量3
class A
def initialize
@a = 11
@@a = 22
a = 33
end
@a = 1
@@a = 2
a = 3
end #=> 3
您可以訪問實例和類變量如下:
A.instance_variable_get(:@a) #=> 1
A.class_variable_get(:@@a) #=> 2
A.new.instance_variable_get(:@a) #=> 11
A.class_variable_get(:@@a) #=> 22
對於其他價值,如果你調用這個類initialize
,並創建一個新的對象,這將返回最後計算的表達式,這將是局部變量a
if A.respond_to?(:initialize, true)
A.new.method(:initialize).call} #=> 33
end
不需要該方法(:初始化)業務。只需「發送」它。 –
此外,你的'respond_to'檢查有缺陷(你檢查了錯誤的對象)並且不需要('initialize' _will_ be there) –
這是對的,謝謝! – poctek
我相信你是在談論this exercise。
我不知道你怎麼可以從外部訪問本地範圍的變量。這被稱爲本地範圍的原因。對於其他人:
類定義後,嘗試:
A.instance_variable_get(:@a) # => 1
A.class_variable_get(:@@a) # => 2
A.new.instance_variable_get(:@a) # => 11
A.class_variable_get(:@@a) # => 22
編輯:我圍繞這個代碼位出場,我想我想通:
a = class A
def initialize
@a = 11
@@a = 22
a = 33
end
@a = 1
@@a = 2
a = 3
end
A.instance_variable_get(:@a) # => 1
A.class_variable_get(:@@a) # => 2
a # => 3
A.new.instance_variable_get(:@a) # => 11
A.class_variable_get(:@@a) # => 22
A.new.method(:initialize).call # => 33 , basically we tricked Ruby into calling initialize method again, slick huh!
編輯:@RossMc在最後一行擊敗我
不需要該方法(:初始化)業務。只需「發送」它。 –
非常感謝,它幫助! – poctek
你不能從其範圍外訪問'a'。它被稱爲「局部變量」是有原因的。 –