Tôi có một băm như:của Ruby dup/clone đệ quy
h = {'name' => 'sayuj',
'age' => 22,
'project' => {'project_name' => 'abc',
'duration' => 'prq'}}
Tôi cần một dup của băm này, sự thay đổi không ảnh hưởng đến băm gốc.
Khi tôi cố gắng,
d = h.dup # or d = h.clone
d['name'] = 'sayuj1'
d['project']['duration'] = 'xyz'
p d #=> {"name"=>"sayuj1", "project"=>{"duration"=>"xyz", "project_name"=>"abc"}, "age"=>22}
p h #=> {"name"=>"sayuj", "project"=>{"duration"=>"xyz", "project_name"=>"abc"}, "age"=>22}
Ở đây bạn sẽ nhìn thấy project['duration']
được thay đổi trong băm gốc vì project
là một đối tượng băm.
Tôi muốn hàm băm là duped
hoặc cloned
đệ quy. Làm thế nào tôi có thể đạt được điều này?
Thao tác này tạo bản sao đầy đủ của tất cả các đối tượng được tham chiếu bởi 'h'. Điều này có thể là chính xác những gì là cần thiết bởi Sayuj cho chuỗi băm đơn giản. Với các đối tượng phức tạp hơn, điều này có thể không còn mong muốn nữa. Một khi có thể ghi đè phương thức 'Hash # dup' để đảo tất cả các hash trong' giá trị' đệ quy. Nhưng điều đó sẽ cần phải được mở rộng cho mọi loại đối tượng. –
@HolgerChỉ cần: vâng, đó là lý do tại sao nó được gọi là "bản sao sâu" :-) –
Tất nhiên. Tôi chỉ muốn đề cập rằng nó có thể làm nhiều hơn OP dự định (mặc dù nó có lẽ chỉ là tốt) :) Vì vậy, nó chỉ cho, tốt, tham khảo trong tương lai. –