From: nobu@... Date: 2015-03-23T14:01:11+00:00 Subject: [ruby-core:68615] [Ruby trunk - Bug #10997] [Rejected] String in Hash 'prepend', '<<' bug Issue #10997 has been updated by Nobuyoshi Nakada. Description updated Status changed from Open to Rejected `Hash#clone` does not clone the elements, so the value is shared. In the last example, you assign different object. ---------------------------------------- Bug #10997: String in Hash 'prepend', '<<' bug https://bugs.ruby-lang.org/issues/10997#change-51921 * Author: Johan Kim * Status: Rejected * Priority: Normal * Assignee: Yukihiro Matsumoto * ruby -v: ruby 2.2.1p85 (2015-02-26 revision 49769) [x86_64-darwin14] * Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN ---------------------------------------- i used with Rails console **Only String is great** ```ruby original = "a" #=> "a" clone = original.clone #=> "a" clone.prepend("prepend_") #=> "prepend_a" clone #=> "prepend_a" original #=> "a" ``` **but String in Hash then get some issue** ```ruby original = { a: "a" } #=> {:a=>"a"} clone = original.clone #=> {:a=>"a"} clone[:a].prepend("prepend_") #=> "prepend_a" clone #=> {:a=>"prepend_a"} original #=> {:a=>"prepend_a"} ``` i expect `original` to `{:a=>"a"}` **and when you use literal then works** ```ruby original = { a: "a" } #=> {:a=>"a"} clone = original.clone #=> {:a=>"a"} clone[:a] = "prepend_#{clone[:a]}" #=> "prepend_a" clone #=> {:a=>"prepend_a"} original #=> {:a=>"a"} ``` `<<` has same issue too. -- https://bugs.ruby-lang.org/