2017-06-17 36 views
0
class A 
    attr_reader :foo, :bar 
    def initialize 
     @foo = "foo" 
     @bar = 2 
     ..... 
     ..... 
     # many variables like this 
    end 
end 

在这个类中有2个变量。我想给attr_accessor所有的实例变量,比如“attr_accessor *”。这可能吗?如何给attr_accessor类ruby中的所有实例变量

+0

如果你想少打字这样的事情,也有类似(我的)[attr_extras](https://github.com/barsoom/attr_extras)的库去掉了一些样板文件。 –

+1

当你举一个例子时,请包含完整的代码。行'''不需要,但需要任何想要剪切并粘贴代码的人去除它们。他们应该被删除。示例中给出的数据相同(此处不相关)。例如'[1,5,2 ...]'应该写成'arr = [1,5,2]',数组的大小足以说明问题的重点。通过包含变量'arr',读者可以在回答和评论中引用它,而不必定义它。 –

回答

2

一个有点hackish,并仅限于您的具体的例子,但刚刚回答的问题(在其第二化身):

class A 
    def initialize 
    @foo = 1 
    @bar = 2 
    #add as many instance variables you need 
    end 
    attr_accessor *A.new.instance_variables.map { |s| s[1..-1] } 
end 

obj = A.new 
obj.foo  #=> 1 
obj.bar  #=> 2 
obj.bar = 3 #=> 3 
obj.bar  #=> 3 

更多信息,请参见Object#instance_variables

2

你的类不知道在#initialize中分配的变量。做你要求的东西很少见,所以我会用“不”来回答。不管怎样,技术上都是可能的,但我不会沿着这条道路前进。

+0

如果你想知道如何做,我会用'method_missing'和'define_method'来完成。 –

+0

但是,完全不建议 –

+0

对不起,我更新了这个问题。请为此建议我 – Elangovan

3

你想要的是已经实现,它被称为OpenStruct

require 'ostruct' 
a = OpenStruct.new(foo: 1, bar: 2) 
a.foo # => 1 
a.bar # => 2 

至少,我猜这是你想要什么

+0

对不起,我更新了这个问题。请为此建议我 – Elangovan

1

另一种可能性是使用哈希作为属性。由于您只能访问散列,而不需要替换它,因此attr_reader就足够了。对于初始化,您可以使用**kwargs

class A 
    attr_reader :attributes 
    def initialize(**kwargs) 
    @attributes = kwargs 
    end 
end 

a = A.new(foo: 1, bar: 2) 
puts a.attributes[:foo] 
#=> 1 
puts a.attributes[:bar] 
#=> 2 

a.attributes[:baz] = 3 
puts a.attributes[:baz] 
# => 3 

puts a.attributes[:bak].inspect 
# => nil 
+0

对不起,我更新了这个问题。请为此建议我 – Elangovan

1

一个结构定义了一个初始化方法的类和一气呵成的所有访问者:

A = Struct.new(:foo, :bar) 

an_a = A.new("foo", 1) 
p an_a.methods # => [:foo, :bar, :foo=, :bar=, ...] 
+0

对不起,我更新了问题。请为此建议我 – Elangovan