如何给类ruby中的所有实例变量赋予attr_accessor

时间:2017-06-17 17:12:00

标签: ruby

class A
   attr_reader :foo, :bar
   def initialize
      @foo = "foo"
      @bar = 2
      .....
      .....
      # many variables like this
   end
end

在这个类中有2个变量。我想给attr_accessor提供所有的实例变量,比如" attr_accessor *"。这有可能吗?

5 个答案:

答案 0 :(得分:3)

您想要的内容已经实现,它被称为OpenStruct

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

至少,我猜这是你想要的

答案 1 :(得分:2)

您的班级不了解#initialize中分配的变量。做你要求的事情并不常见,所以我会用“不”来回答这个问题。从技术上讲,它可能以某种方式,但我不会遵循这条道路。

答案 2 :(得分:2)

有点ha and,仅限于你的具体例子,但只是回答这个问题(在第二个版本中):

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

答案 3 :(得分: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

答案 4 :(得分:1)

Struct定义了一个带有initialize方法的类,并且所有访问器都在一个:

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

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