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
outputsjekyll 3.7.3;Error:can't dup NilClass
I使用new_data=new_page['data']。dup但是new_page['data']=new_data
outputsjekyll 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))