我想创建大量的属性,如果用这样的方法调用构建,可以轻松完成,
attr_accessor :attr_list
def attr_list
[:x1, :y1, :x2, :y2]
end
这不起作用。还有其他方法可以达到这个目的吗?
任何帮助将不胜感激。
答案 0 :(得分:14)
想出来,
def self.attr_list
[:x1, :y1, :x2, :y2]
end
attr_accessor *attr_list
<强>解释强>
由于 attr_accessor 是一个需要参数列表的方法调用。所以我们不能按原样传递数组。 ( * )会将数组转换为参数列表。
只需要定义一个返回传递给attr_accessor的属性列表数组的类方法。
也适用于attr_accessible(或类似的东西)。
答案 1 :(得分:2)
在不发出警告的情况下执行此操作的一种方法:
class MyClass
ATTR_LIST = [:x1, :y1, :x2, :y2]
attr_accessor(*ATTR_LIST)
end
答案 2 :(得分:1)
接受的解决方案会产生红宝石警告:
'*'被解释为参数前缀
另一种方法是做这样的事情:
def attr_list
[:x1, :y1, :x2, :y2]
end
attr_list.each { |attr| attr_accessor attr }
或
ATTR_LIST = [:x1, :y1, :x2, :y2]
ATTR_LIST.each { |attr| attr_accessor attr }