我试图从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'。它被称为“局部变量”是有原因的。 –