如何在ruby中访问这些内部变量?

时间:2013-02-23 13:27:52

标签: ruby metaprogramming

我正在尝试学习一些基本的ruby元编程,并且已经给了这样一个类:

class A
  def initialize
    @a = 11
    @@a = 22 
    a = 33
  end

  @a = 1
  @@a = 2
  a = 3
end

我需要像这样输出这些变量而不修改类:

1
2
3
11
22
33

到目前为止,这是我的代码:

p A.instance_variable_get(:@a) #=> 1
p A.class_variable_get(:@@a) #=> 2

A.new.instance_eval do
    puts @a #=> 11
end

现在我如何访问剩余的变量?

2 个答案:

答案 0 :(得分:2)

class A
  def initialize
    @a = 11
    @@a = 22 
    a = 33
  end

  @a = 1
  @@a = 2
  a = 3
end

p A.instance_variable_get(:@a) # >> 1
p A.class_variable_get(:@@a) # >> 2

p A.new.instance_variable_get(:@a) >> 11

p A.class_variable_get(:@@a) # >> 22

请注意,获取var 22的行与获取var 2的行相同,因为它是同一个变量,并且在调用A.new时它的值被覆盖。

对于普通的a变量,你无法得到它们,因为它们是本地变量并且不再存在。

答案 1 :(得分:1)

好的,那么感兴趣的人的最终解决方案:

catcher = class A
  def initialize
    @a = 11
    @@a = 22
    a = 33
  end

  @a = 1
  @@a = 2
  a = 3
end

对那个作弊但是这有效

puts A.class_eval { @a } #=> 1
puts A.class_variable_get :@@a #=> 2

puts A.new.instance_eval { @a } #=> 11

puts catcher #=> 3

puts A.new.send :initialize #=> 33