我可以理解这段代码意味着什么。我需要使用它,我也想了解它的含义。有人可以一块一块地向我解释一下吗?
目前我将其视为"变量' hash'包括关键的花朵'和'蓝色'。" "每个都使用占位符'迭代哈希值,只复制其键。在通过使用.delete方法删除所有先前的键来重新分配其值之后,键被切换到符号并通过[]' s插入到散列中。"
我是对的还是我错过了一步?我是Ruby初学者,正在寻求帮助。
hash = {"flowers" => "blue"}
hash.keys.each { |key| hash[key.to_sym] = hash.delete(key) }
puts hash
答案 0 :(得分:1)
如果你查找.to_sym
的内容,它会转换为符号..我不是专家,但:a
有点像文字字符串,但有一些差异在这里不相关。
irb(main):008:0> "a".to_sym
=> :a
irb(main):009:0>
你写
“变量'hash'包含键'flowers'和'blue'
没有。该哈希中只有一个键值对。
代码遍历散列,在第一次也是唯一的迭代中,它将键设置为“:flowers”
hash [:flowers] =“blah”将在哈希中创建一个新密钥,名称为“:flowers”,值为“blah”
但该代码的作用是在右侧,它确实是hash.delete(键)
让我们看看hash.delete(key)做什么
说我做hash = {:a => 5,:b => 2}所以两个键:a和:b,你看到与每个键相关的值
irb(main):009:0> hash
=> {:a=>4, :b=>2}
irb(main):010:0> hash.delete(:a)
=> 4
irb(main):011:0> hash
=> {:b=>2}
irb(main):012:0>
所以hash.delete(key)删除指定键的键值对,并返回它删除的键对的值。
因此,您的问题中的代码(特别是如果您查看您看到的结果)它具有重命名所有键的效果,在这种情况下,一个键,因为哈希中只有一个键,并保持值。它通过创建新的键值对同时删除原始键值来完成此操作。它在删除原始值之前获取原始键值并创建新的键值对。
更多地关注迭代
假设我们使用这个哈希值...并且我将使用多个键值对,因为当存在多个键值对时更容易理解哈希,因为哈希是存储一堆键值对。
irb(main):026:0> hash
=> {"a"=>2, "b"=>4}
irb(main):027:0> hash.keys.each { |key| puts key }
a
b
=> ["a", "b"]
irb(main):028:0> hash.each { |i,j| puts i }
a
b
=> {"a"=>2, "b"=>4}
irb(main):029:0>
所以是的hash.keys.each { |key ... }
将遍历所有的密钥
如果你做了| i,j |你会看到会发生什么。
如果你做hash.each而只是| i |,那么它遍历所有的键和值,key1 value1 key2 value2 e.t.c。
irb(main):029:0> hash.each { |i| puts i }
a
2
b
4
=> {"a"=>2, "b"=>4}
irb(main):030:0>
你写
键被切换为符号
你应该使用一个更技术性的术语,比如重命名,但你甚至不需要这样做。你应该能够在代码中思考。 hash [key.to_sym] =应该足够描述。它接受密钥,从中生成一个符号,然后为该散列分配一个新值[newkey]
并在哈希重新分配后通过[]的插入哈希 使用.delete方法删除所有以前的键。“
没有。如果您说a = b,那么b
会在分配到a
之前先进行评估。
在您显示的代码中,在分配的右侧,您有删除,因此首先删除,我们看到它返回创建新键值对时使用的原始值。 / p>