2015-10-14 20 views

回答

3

當您定義此類時,輸出將是本地作用域變量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 
+0

不需要該方法(:初始化)業務。只需「發送」它。 –

+0

此外,你的'respond_to'檢查有缺陷(你檢查了錯誤的對象)並且不需要('initialize' _will_ be there) –

+0

這是對的,謝謝! – poctek

3

我相信你是在談論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在最後一行擊敗我

+1

不需要該方法(:初始化)業務。只需「發送」它。 –

+0

非常感謝,它幫助! – poctek