2017-04-14 69 views
-1

我想参考在sum_class_vars范围内动态创建的类变量foo1,foo2foo3而不知道它们的标识符是什么。举例来说,我们可以实现一个sum函数,它将变量相加。如何在类范围内创建并引用动态创建的类变量

class Test 
     def initialize 
     end 

     def sum_class_vars 
     end 
    end 

    t = Test.new 
    #add class variables foo1 foo2 foo3 to Test 

我该怎么做?

+0

t.foo1 t.foo2 t.foo3 –

回答

2

与往常一样变量,但声明后,只能使用:

class Test  
    def initialize 
    end 

    def sum_class_vars 
    foo1 + foo2 + foo3 
    end 
end 

t = Test.new 

class << t 
    attr_accessor :foo1, :foo2, :foo3 
end 

t.foo1 = t.foo2 = t.foo3 = 2 

p t.sum_class_vars 
#=> 6 
+0

您应该明确指出,这只会为特定实例't'创建访问器。 –

+0

@CarySwoveland你是绝对正确的。仅用于't'实例。我认为@horror_fan知道是否使用'class << t' – idej

+0

就像我说过的那样,Ruby是新的,我认为class << t是你如何添加类变量。我对实例变量不感兴趣。我想将类变量添加到我的类中,并能够在不知道它们的特定标识符的情况下引用它们。我不在乎总结这只是一个例子。在你的例子中 –

0
class Test 
    def sum_instance_vars 
    foo1 + foo2 
    end 
end 

Test.send(:attr_accessor, :foo1, :foo2, :foo3) 

t1 = Test.new 
    #=> #<Test:0x007fe12c014838> 
t1.foo1 = 1 
t1.foo2 = 2 
t1 
    #=> #<Test:0x007fe12c014838 @foo2=2, @foo1=1> 
t1.sum_instance_vars 
    #=> 3 

@foo1@foo2实例变量,不类变量(或类的实例变量)。

+0

那么我如何创建类变量并引用它们,即时通讯对实例变量不感兴趣。我编辑了这篇文章,使其更加清晰。 –

+0

使用[Module#class_variable_set](https://ruby-doc.org/core-2.4.0/Module.html#method-i-class_variable_set)来动态创建类变量。你的评论告诉我,@idej和我都不了解你的问题。 –

+0

我认为它是我刚刚提出的问题,由于刚刚接触ruby,误解了一些ruby的概念。 –