1

私は次のことを行っており、TestClass.my_var戻ることを期待しています"my_var_here":

irb(main):001:0> def create_a_class class_name, my_var
irb(main):002:1>     klass = Object.const_set class_name, Class.new
irb(main):003:1>     klass.class_variable_set :@@my_var, my_var
irb(main):004:1>     klass.instance_eval do
irb(main):005:2*         def my_var
irb(main):006:3>             @@my_var
irb(main):007:3>         end
irb(main):008:2>     end
irb(main):009:1>     klass
irb(main):010:1> end
=> nil
irb(main):011:0> create_a_class "TestClass", "my_var_here"
=> TestClass

代わりに、これを取得します:

irb(main):012:0> TestClass.my_var
(irb):6: warning: class variable access from toplevel
NameError: uninitialized class variable @@my_var in Object
        from (irb):6:in `my_var'
        from (irb):12
        from C:/Ruby193/bin/irb:12:in `<main>'

私は何を間違っていますか?任意の入力をいただければ幸いです。

編集:私はこのようにしてみましたが、うまくいくようですが、実際にはRuby Way™のようには感じません(また、厄介な警告が表示されないようにしたいです)

irb(main):001:0> def create_a_class class_name, _my_var
irb(main):002:1>     klass = Object.const_set class_name, Class.new
irb(main):003:1>     klass.instance_eval do
irb(main):004:2*         @@my_var = _my_var
irb(main):005:2>         def my_var
irb(main):006:3>             @@my_var
irb(main):007:3>         end
irb(main):008:2>     end
irb(main):009:1>     klass
irb(main):010:1> end
=> nil
irb(main):011:0> create_a_class "TestClass", "my_var_here"
(irb):4: warning: class variable access from toplevel
=> TestClass
irb(main):012:0> TestClass.my_var
(irb):6: warning: class variable access from toplevel
=> "my_var_here"
4

1 に答える 1

2

初めに?なぜクラス変数を使用しているのですか? クラスでもインスタンス変数を使用できることをご存知ですか? それらははるかに予測可能です。

クラス変数は字句的に検索されます。

class Foo
  @@a = 1
end

class Bar
  @@a = 2

  def Foo.a; @@a end
end

p Foo.a # => 2

本当にクラス変数を使用したい場合は、 #eval (何らかの形式で) を使用してメソッドを定義する必要があります。

def create_a_class class_name, my_var
  klass = Object.const_set class_name, Class.new
  klass.class_variable_set :@@my_var, my_var
  klass.class_eval <<-RUBY
    def self.my_var
      @@my_var
    end
  RUBY
  klass
end

create_a_class "Name", "var"
p Name.my_var
于 2012-12-04T16:23:31.490 に答える