0

我正在尝试学习一些基本的 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

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

4

2 回答 2

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变量,您无法获取它们,因为它们是本地变量并且不再存在。

于 2013-02-23T13:31:10.603 回答
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 
于 2013-02-23T16:32:31.533 回答