9

我想创建大量属性,如果使用这样的方法调用构建这些属性,可以轻松完成,

 attr_accessor :attr_list 

 def attr_list
   [:x1, :y1, :x2, :y2]   
 end

这是行不通的。有没有其他方法可以实现这一目标?

任何帮助将不胜感激。

4

3 回答 3

16

弄清楚了,

def self.attr_list
 [:x1, :y1, :x2, :y2]   
end

attr_accessor *attr_list 

解释:

由于 attr_accessor是一个需要参数列表的方法调用。所以我们不能按原样传递数组。( * ) 将数组转换为参数列表。

只需要定义一个类方法返回传递给 attr_accessor 的属性列表数组。

也适用于 attr_accessible(或任何类似的东西)。

于 2013-06-12T18:08:01.467 回答
4

在不引起警告的情况下执行此操作的一种方法:

class MyClass
    ATTR_LIST = [:x1, :y1, :x2, :y2]
    attr_accessor(*ATTR_LIST)
end
于 2016-01-26T23:46:11.250 回答
3

接受的解决方案会产生一个红宝石警告:

'*' 解释为参数前缀

另一种方法是做这样的事情:

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 }
于 2015-02-25T01:05:24.660 回答