Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.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 在Rails中,为什么我的控制器参数会被类修改_Ruby_Ruby On Rails 4 - Fatal编程技术网

Ruby 在Rails中,为什么我的控制器参数会被类修改

Ruby 在Rails中,为什么我的控制器参数会被类修改,ruby,ruby-on-rails-4,Ruby,Ruby On Rails 4,我有一个控制器动作与此类似: 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

我有一个控制器动作与此类似:

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

参数还在更新

这是因为函数调用获取的是对参数的引用,而不是副本。如果您执行类似于
opts[:start]=(Time.now-30.days)的操作,则您正在编辑params对象

a=params
:现在两个变量都指向内存中的同一位置。您只复制了指针


谷歌搜索
ruby对象复制
ruby深度复制
,或在stackoverflow搜索。第一次尝试时,您可以尝试
params.clone

,这是因为您的函数调用获取的是对参数的引用,而不是副本。如果您执行类似于
opts[:start]=(Time.now-30.days)的操作,则您正在编辑params对象

a=params
:现在两个变量都指向内存中的同一位置。您只复制了指针


谷歌搜索
ruby对象复制
ruby深度复制
,或在stackoverflow搜索。第一次尝试时,您可以尝试
params.clone

每当您更新params的任何值时,都可以像这样复制一个params

a=params.clone

它将在内存中创建一个新元素

如果您这样做,它不会在内存中创建新元素,它将指向相同的内存

a=params


尝试此操作

无论何时更新参数的任何值,都要像这样复制参数

a=params.clone

它将在内存中创建一个新元素

如果您这样做,它不会在内存中创建新元素,它将指向相同的内存

a=params


试试这个

我试着复制了一份,见编辑,那也更新了。那我怎么能复制这个物体呢?不,你没有
params
a
指向内存中的同一位置。您只复制了指针。谷歌搜索
ruby对象复制
ruby深度复制
,或在stackoverflow搜索。第一次尝试时,您可以尝试
params.clone
。我不知道这一点!太好了,你能补充一下你的答案吗?我会接受的。我试着复制了一份,见编辑,那也更新了。那我怎么能复制这个物体呢?不,你没有
params
a
指向内存中的同一位置。您只复制了指针。谷歌搜索
ruby对象复制
ruby深度复制
,或在stackoverflow搜索。第一次尝试时,您可以尝试
params.clone
。我不知道这一点!太好了,你能补充一下你的答案吗?我接受。相关:只是补充一点,永远不要改变方法的参数可能是一个很好的做法。它会使该方法的调用者感到困惑。为什么它不修改您传入的内容呢?创建对同一对象的新引用不会创建新对象,而是创建新引用。也许您想克隆或深度克隆对象?因为我们必须将日期标准化为标准格式,然后在不同数据库的多个查询中进行修改-mysql、mongo、redis查询、elasticsearch和big query。对于我们来说,从标准时间开始并根据使用的查询进行修改更容易。相关:只是补充一点,永远不要更改方法的参数可能是一个好的做法。它会使该方法的调用者感到困惑。为什么它不修改您传入的内容呢?创建对同一对象的新引用不会创建新对象,而是创建新引用。也许您想克隆或深度克隆对象?因为我们必须将日期标准化为标准格式,然后在不同数据库的多个查询中进行修改-mysql、mongo、redis查询、elasticsearch和big query。对于我们来说,从标准时间开始并根据使用的查询进行修改更容易。