KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
According to the specification , strings that are used as a key to a hash are duplicated and frozen. Other mutable objects do not seem to have such special consideration. For example, with an array key, the following is possible. a = [0] h = {a => :a} h.keys.first[0] = 1 h # => {[1] => :a} h[[1]] # => nil h.rehash h[[1]] # => :a On the other hand, a similar thing cannot be done with a string key. s = "a" h = {s => :s} h.keys.first.upcase! # => RuntimeError: can't modify frozen String Why is string designed to be different from other mutable objects when it comes to a hash key? Is there any use case where this specification becomes useful? What other consequences does this specification have? I actually have a use case where absence of such special specification about strings may be useful. That is, I read with the yaml gem a manually written YAML file that describes a hash. the keys may be strings, and I would like to allow case insensitivity in the original YAML file. When I read a file, I might get a hash like this: h = {"foo" => :foo, "Bar" => :bar, "BAZ" => :baz} And I want to normalize the keys to lower case to get this: h = {"foo" => :foo, "bar" => :bar, "baz" => :baz} by doing something like this: h.keys.each(&:downcase!) but that returns an error for the reason explained above.
Tags (comma-separated)
Save Edits
Cancel