如何从类ruby之外获取值

时间:2015-10-14 10:11:30

标签: ruby-on-rails ruby metaprogramming

我试图解决http://ruby-metaprogramming.rubylearning.com/中的练习1,但我不知道如何获得" a"来自A类及其实例的变量。

以下是代码:

class A
  def initialize
    @a = 11
    @@a = 22
    a = 33
  end
  @a = 1
  @@a = 2
  a = 3
end

2 个答案:

答案 0 :(得分: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 :(得分: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