如何在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
如何在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
不知道什麼一個班輪這樣做,給你買了,但你可以做這樣的事情:
%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 }
試試這個,
@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"
哈希將被共享,導致與您的示例相似的問題 –
因爲你分配一個散列你不能在一行中做到這一點。使用維奈的回答
>> 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
謝謝,這是有幫助的。同上我的問題如下:你會說保持現狀是最佳的可讀性還是會更好地使用上述格式? – BC00
現狀適用於我,儘管爲了減少重複,也許您可以將Hash.new調用包裝爲私有方法 – rusty
好的,謝謝,這很有幫助 – BC00