Ruby,初始化,分配变量值

时间:2013-03-28 16:29:50

标签: ruby ruby-on-rails-3 initialization

如何在ruby initialize方法中为多个实例变量分配相同的值? 希望重构以下内容:

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 个答案:

答案 0 :(得分: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 }

答案 1 :(得分:0)

您不能在一行中执行此操作,因为您正在分配哈希。使用Vinay的答案

>> 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

答案 2 :(得分:-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"