2012-02-13 53 views
1

初始化類我只是想知道是否有從數組初始化類實例的任何最好的辦法:代碼重構 - 從陣列

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

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

回答

10
我通常使用下面的風格

如果您需要忽略一些參數,你可以做到以下幾點:

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

或更短:

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

+1,我通常使用下劃線版本。但是,還應該懷疑'row'是否應該是一個帶有描述性鍵名的散列。 – 2012-02-13 15:31:46

2
在我看來

你不應該使用初始化這種風格,因爲它是非常容易出錯

類的接口必須是從第一眼明確和可見所以不是

def method(array_of_attributes) 

棒到

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

因爲它是很容易看到什麼方法期望從自動生成的文檔和從尋找T法定義

也沒有什麼不妥傳遞屬性的陣列的方法,如果這是你必不可少的:

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 
6

如果你有一個數據的工作像

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

和你必須按照字段的位置走,然後你的代碼就OK了。你可以縮短這樣的:

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

如果你不介意做一些元編程(只是不斷的所有名稱和在一個地方一起指數):

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