我的控制器动作与此类似:
def reports
puts params
@stats = Client.stats(params)
puts params
end
最初的参数可能如下所示:
{ end: '2012-01-01 21:00:19' }
在我的客户端模型中,我有这个:
def self.stats(opts)
opts[:start] = (Time.now - 30.days).to_i
...do some calculations..
return stats
end
如果我检查在函数运行之前和之后发送的params对象,我可以看到它已被self.stats方法修改过。
在上面的例子中,我没有在初始参数中发送'start',该方法将其添加到计算中 - 正如预期的那样。
我没想到的是该函数会修改原始哈希值!
有人可以解释为什么会这样吗?
- 编辑 -
我忘了说我试图创建一个params的副本并使用相同的问题。
def reports
a = params
@stats = Client.stats(a)
puts params
end
params还在更新吗?!
答案 0 :(得分:4)
那就是,因为你的函数调用获得对params的引用而不是副本。如果您执行opts[:start] = (Time.now - 30.days).to_i
之类的操作,则表示您正在编辑params对象。
a = params
:现在两个变量都指向内存中的相同位置。您只复制了指针。
Google ruby object copy
或ruby deep copy
或在stackoverflow上搜索。第一次尝试时,您可以尝试params.clone
。
答案 1 :(得分:1)
每当你更新params的任何值时,请复制这样的params副本
a = params.clone
它将在内存中创建一个新元素
如果您喜欢这样,它将不会在内存中创建一个新元素,它将指向相同的内存
a = params
试试这个