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 に答える