如何在 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 初始化方法中为多个实例变量分配相同的值?希望重构以下内容:
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 }
您不能在一行中执行此操作,因为您正在分配哈希。使用维奈的答案
>> 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
试试这个,
@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"