Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby,初始化,分配变量值_Ruby_Ruby On Rails 3_Initialization - Fatal编程技术网

Ruby,初始化,分配变量值

Ruby,初始化,分配变量值,ruby,ruby-on-rails-3,initialization,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 试试这个 @weekly_stats = @report_times = @email_stats = Hash

如何在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
试试这个

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

您不能在一行中执行此操作,因为您正在分配哈希。使用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

不确定在一行中这样做能给你带来什么,但你可以这样做:

%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格式更好?这取决于具体情况。为什么需要3个具有相同值的变量?这些是起始值,然后我为每个哈希分配不同的键/值数据,并将其传递给另一个类谢谢,这很有帮助。与我下面的问题相同:您是说保持现状对可读性来说是最佳的,还是使用上述格式更好?现状对我来说很有用,但为了减少重复,您可以将哈希打包。新调用到私有方法哈希将被共享,从而导致类似的问题,如您的示例所示