2015-10-14 21 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