代码重构 - 从数组初始化类

时间:2012-02-13 12:30:15

标签: ruby

我只是想知道是否有从数组初始化类实例的最佳方法:

def initialize(row)
    @name        = row[2]
    @description = row[3]
    @status      = row[5]
    ....

4 个答案:

答案 0 :(得分:10)

我通常使用以下样式:

def initialize row
  @name, @description, @status = *row
end

如果您需要忽略某些参数,可以执行以下操作:

ignored, ignored, @name, @description, ignored, @status = *row

或更短:

_, _, @name, @description, _, @status = *row

答案 1 :(得分:6)

如果您必须使用

等数据
row = [ 0, 1, 'Smith', 'red nose', 3, 'awake']

你必须按字段的位置,然后你的代码就行了。你可以像这样缩短它:

def initialize (row)
  @name, @description, @status = row.values_at(2,3,5) # things like (5,2,3) are allowed.
end

答案 2 :(得分:2)

在我看来,你不应该使用这种初始化风格,因为它非常容易出错

类接口必须从第一眼开始就是显而易见的,而不是

def method(array_of_attributes)

坚持

def method(meaningful_name_1, meaningful_name_2, options={})

因为这样可以更容易地看到自动生成的文档和查看方法定义所期望的方法

将属性数组传递给方法也没有错,如果这对你来说是必不可少的:

def method_one
  arguments_for_method_two = [name, description, status]
  method_two(*arguments_for_method_two)
end

def method_two(name, description, status)
  # blah ...
end

答案 3 :(得分:1)

如果你不介意做一些元编程(只是将所有的名字和索引放在一起):

{:name => 2, :description => 3, :status => 5}.each do |name, i| 
  instance_variable_set("@#{name}", row[i]) 
end