我正在使用Ruby on Rails 3,因为我声明了一个包含大量变量的类,所以我会一次为那些类变量声明所有'attr_reader'或'attr_writer'
我试过
class Persone
attr_reader :all
def initialize(name, surname, ...)
@name = name
@surname = surname
... # A lot of variables!
end
end
但这不起作用。
答案 0 :(得分:3)
class Persone
INSTANCE_VARS = [:name,:surname]
attr_reader *INSTANCE_VARS
def initialize(*params)
params.each_with_index do |param,index|
instance_variable_set("@"+INSTANCE_VARS[index].to_s,param)
end
end
end
答案 1 :(得分:2)
我应该使用的东西:
attr_accesor :name, :surname, ...
def initialize(name, surname, ...)
@name = name
@surname = surname
...
end
这样你只需要一步就能得到一个setter和一个getter,但你仍然需要枚举所有变量名。
答案 2 :(得分:1)
看一下Struct
课程:
Persone = Struct.new :name, :surname, :address
p = Persone.new 'John', 'Smith', '12 Street 345'
puts p.address
答案 3 :(得分:1)
答案可能会迟到,但迟到总比没有好:
class Persone
def initialize(name, surname, ...)
@name = name
@surname = surname
... # A lot of variables!
instance_variables.each do |var|
eval "def #{var.to_s.sub('@', '')}; #{i}; end"
end
end
end
答案 4 :(得分:0)
class Persone
VARS = [:name, :surname, ...]
VARS.each{|var|
attr_reader var
}
def initialize(params)
params.each_pair{|key,value|
self.instance_variable_set("@#{key}".to_sym, value
}
end
end
答案 5 :(得分:0)
在Chris Wouters示例中,instance_variable块有一个拼写错误...
instance_variables.each do |var|
eval "def #{var.to_s.sub('@', '')}\n #{var}; end"
end