2013-03-28 163 views
0

如何在ruby初始化方法中爲多個實例變量賦值相同的值? 展望重構如下:Ruby,初始化,分配變量值

def initialize 
@weekly_stats = Hash.new {|h, k| h[k]={}} 
@report_times = Hash.new {|h, k| h[k]={}} 
@email_stats = Hash.new {|h, k| h[k]={}} 
end 

回答

3

不知道什麼一個班輪這樣做,給你買了,但你可以做這樣的事情:

%w{weekly_stats report_times email_stats}.each { |v| instance_variable_set("@#{v}", Hash.new {|h, k| h[k]={}} } 

或者掰成兩個非重複線,如:

vars = %w{weekly_stats report_times email_stats} 
vars.each { |v| instance_variable_set("@#{v}", Hash.new {|h, k| h[k]={}} } 

或將其與jvnill的回答結合:

value = Hash.new {|h, k| h[k]={}} 
vars = %w{weekly_stats report_times email_stats} 
vars.each { |v| instance_variable_set("@#{v}", value.dup } 
+0

謝謝,這是有幫助的。同上我的問題如下:你會說保持現狀是最佳的可讀性還是會更好地使用上述格式? – BC00

+0

現狀適用於我,儘管爲了減少重複,也許您可​​以將Hash.new調用包裝爲私有方法 – rusty

+0

好的,謝謝,這很有幫助 – BC00

-1

試試這個,

@weekly_stats = @report_times = @email_stats = Hash.new {|h, k| h[k]={}} 

這工作,但你應該知道,如果您使用的是數字變量,這是隻有適合自己情況的安全在Ruby中是不可變的。如果你有一個字符串嘗試同樣的事情,例如,你可能最終會與一些行爲,沒想到你:

ruby-1.9.2-p180 :001 > foo = bar = "string" 
=> "string" 
ruby-1.9.2-p180 :002 > foo.upcase! 
=> "STRING" 
ruby-1.9.2-p180 :003 > bar 
=> "STRING" 
+0

哈希將被共享,導致與您的示例相似的問題 –

0

因爲你分配一個散列你不能在一行中做到這一點。使用維奈的回答

>> a = b = c = { a: 'b', c: 'd' } 
>> a # {:a=>"b", :c=>"d"} 
>> a[:a] = 2 # 2 
>> b # {:a=>2, :c=>"d"} 

在上面的例子中,b改變,當你改變a。我不知道是否有寫這在一個單一的線,但嘗試下面的代碼的方式,而不是

@weekly_stats = Hash.new {|h, k| h[k]={}} 
@report_times = @weekly_stats.dup 
@email_stats = @weekly_stats.dup 
+0

嗯,好的謝謝。你會說保持現狀對於可讀性來說是最佳的嗎?或者使用a = b = c格式會更好嗎? – BC00

+0

,這取決於。爲什麼你需要3個具有相同值的變量? – jvnill

+0

這些是開始值,然後我將不同的鍵/值數據分配給每個散列並將它傳遞給另一個類 – BC00