我正在尝试通过一些修改将副本添加到数组中
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
当我输出page.data时,永久链接是不同的,但是data['layout']
对于数组中的所有项目都是相同的。我还尝试了data = new_page.data.dup
并在每个实例中写出new_page.data
。
答案 0 :(得分:2)
(已移动注释以回答格式问题。)
请提供数据示例;我在使用类似结构的情况下遇到了零问题,例如
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
我得到以下输出:
[{"name"=>"page 1", "data"=>{"permalink"=>"p1 perma", "layout"=>"p1 layout"}},
{"name"=>"page 2", "data"=>{"permalink"=>"p2 perma", "layout"=>"p2 layout"}},
{"name"=>"page 1", "data"=>{"permalink"=>"p1 perma whatever", "layout"=>"app"}},
{"name"=>"page 2", "data"=>{"permalink"=>"p2 perma whatever", "layout"=>"app"}}]
不相关,但我将数组串联分开;而是考虑map
遍历页面并使用原始的pages
和修改后的数组创建一个新数组。现在,您正在执行不必要的dup
附加操作,这会增加一些混乱。
我还将把data
的重复/修改分解为一个单独的方法(可能还包括整个重复过程),以使事情变得更加紧张:
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
或使用原始pages
和修改后的新页面进行任何操作。
https://github.com/davelnewton/stackoverflow/tree/master/ruby/51289405
答案 1 :(得分:1)
这里的问题是dup只是浅表副本。这意味着它将创建第一层(阵列本身)的副本,但不会创建任何较深层。
您可能要考虑像full_dup这样的gem,它添加了full_dup方法,该方法可以根据需要深入挖掘以创建数据的完全重复项。
全面披露:我写了full_dup gem。可能还有其他一些宝石也可以发挥作用。