class A
attr_reader :foo, :bar
def initialize
@foo = "foo"
@bar = 2
.....
.....
# many variables like this
end
end
在这个类中有2个变量。我想给attr_accessor提供所有的实例变量,比如" attr_accessor *"。这有可能吗?
答案 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=, ...]