Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.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 on rails 为什么我的复制品也会影响原件?_Ruby On Rails_Ruby_Ruby On Rails 3 - Fatal编程技术网

Ruby on rails 为什么我的复制品也会影响原件?

Ruby on rails 为什么我的复制品也会影响原件?,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,我正在尝试通过一些修改将副本添加到阵列: site.pages.dup.each do | page | new_page = page.dup data = new_page.data data['permalink'] = File.join('/app', page.url) data['layout'] = 'app' site.pages << new_page end site.pages.each do | page

我正在尝试通过一些修改将副本添加到阵列:

  site.pages.dup.each do | page |
    new_page = page.dup
    data = new_page.data
    data['permalink'] = File.join('/app', page.url)
    data['layout'] = 'app'
    site.pages << new_page
  end

  site.pages.each do | page |
    puts page.data
  end 
site.pages.dup.each do| page|
新建页面=page.dup
数据=新页面数据
数据['permalink']=File.join('/app',page.url)
数据['layout']='app'

site.pages这里的问题是dup只是一个浅拷贝。这意味着它会创建第一层的副本,即阵列本身,但不会创建任何更深的层

您可能需要考虑一个类似于Guang-DUP的GEM,它添加了FixyDUP方法,它根据需要深入挖掘以创建数据的完整副本。 完全披露:我写了完整的《宝石》。可能还有其他的宝石也可以使用。

(移动注释以回答格式问题。)

请提供一个数据示例;我在使用类似结构时没有任何问题,例如

pages = [
  {
    'name' => 'page 1',
    'data' => {
      'permalink' => 'p1 perma',
      'layout'    => 'p1 layout'
    }
  },

  {
    'name' => 'page 2',
    'data' => {
      'permalink' => 'p2 perma',
      'layout'    => 'p2 layout'
    }
  },
]
如果我使用(基本上)你的代码,加上我的评论:

pages.dup.each do |p|
  new_page = p.dup

  new_data = new_page['data'].dup

  new_data['layout']    = 'app'
  new_data['permalink'] = "#{new_data['permalink']} whatever"

  new_page['data'] = new_data

  pages << new_page
end
不相关,但我要分离数组串联;取而代之的是,考虑<代码> map < /COD> ping页面,并创建一个新的数组,包括原来的代码>页< /代码>和修改后的数组。现在你正在做一个额外的
dup
,这应该是不必要的,这会增加一些混乱

我还将
数据
dup/修改分解成一个单独的方法(可能包括整个dup过程),以真正保持紧密,大致如下:

def modify_page_data(data)
  new_data = data.dup

  new_data['permalink'] = "#{data['permalink']} whatever"
  new_data['layout'] = 'app'

  new_data
end

def dup_page(page)
  new_page = page.dup
  new_page['data'] = modify_page_data(page['data'])
  new_page
end

new_pages = pages.map(&method(:dup_page))
然后,您可以使用原始
页面
和修改后的新页面进行
concat
或任何您想要的操作


dup
就像文档中所说的那样,是肤浅的<代码>数据
是本地的;您需要将数据复制到新对象中。我该如何做,尝试了
new_page.data=page.data.clone
new_page.data=page.data.dup
另外,它如何影响.layout,而不是.permalink?是否有办法只复制该节点,我尝试了new_page.data=page.data.clone和new_page.data=page.data.dup,为什么它会影响.layout,但不会影响.permalink?您尝试复制更深层次的数据结构失败,因为在该层下面还有另一层。page.data本身就是一个散列,因此dup只复制最顶层的散列级别。散列的内容仍然是共享的引用。这是一个很好的答案,但是
new_data=new_page['data']。dup
outputs
jekyll 3.7.3;Error:can't dup NilClass
I使用new_data=new_page['data']。dup但是
new_page['data']=new_data
outputs
jekyll 3.7.3;Error:undefined method[]你的意思是?[]
new\u page['data']是空的,但new\u page.data是散列。@这就是为什么您需要具体的原因;正如我所说,我建立了一个数据结构,因为没有办法知道您实际上在处理什么。您需要修改示例以适应实际处理的数据结构/实例等。这个想法也是一样的。谢谢,我是ruby新手,所以很难找出错误的来源。
def modify_page_data(data)
  new_data = data.dup

  new_data['permalink'] = "#{data['permalink']} whatever"
  new_data['layout'] = 'app'

  new_data
end

def dup_page(page)
  new_page = page.dup
  new_page['data'] = modify_page_data(page['data'])
  new_page
end

new_pages = pages.map(&method(:dup_page))