我试图在散列中增加密钥。例如。我试图搞定这个
{:b => "crayons", :c => "colors", :d => "apples"}
变成这个
{:c => "crayons", :d => "colors", :e => "apples"}
我认为这段代码可以解决问题,但事实并非如此。我需要改变什么?
def hash(correct)
mapping = correct.each{|key, element| key.next}
Hash[correct.map {|key, element| [mapping[key], element]}]
end
答案 0 :(得分:5)
使用Enumerable#each_with_object
def hash_correct(hsh)
hsh.each_with_object({}) { |(k,v), hsh| hsh[k.succ] = v }
end
hash_correct({:b => "crayons", :c => "colors", :d => "apples"})
# => {:c=>"crayons", :d=>"colors", :e=>"apples"}
答案 1 :(得分:4)
def hash(correct)
Hash[correct.map{|key, element| [key.next, element]}]
end
答案 2 :(得分:2)
h = {:b => "crayons", :c => "colors", :d => "apples"}
h.keys.map(&:succ).zip(h.values).to_h
#=> {:c=>"crayons", :d=>"colors", :e=>"apples"}
如果意图是修改(而不是保留)原始哈希,则可以在适当的位置完成更新:
keys = h.keys.reverse
keys.each { |k| h[k.succ] = h[k] }
h.delete(keys.last)
可以归结为:
h.delete(h.keys.reverse.each { |k| h[k.succ] = h[k] }.last)
答案 3 :(得分:1)
def hash(correct)
exp_hash = correct.map { | k, v| {k.next => v} }
Hash[*exp_hash.collect{|h| h.to_a}.flatten]
end
correct = {:b => "crayons", :c => "colors", :d => "apples"}
答案 4 :(得分:1)
我认为这段代码可以解决问题,但事实并非如此。
mapping = correct.each{|key, element| key.next}
如果你转到ruby Symbol文档并点击next()的链接...惊喜,下一个没有条目,但窗口顶部的描述说:
SUCC
与sym.to_s.succ.intern相同。
由此你必须推断出next()是succ()的同义词。所以Symbol#next / succ通过调用to_s()将符号转换为字符串。好吧,你知道你将从to_s返回一个字符串,无论你对该字符串做什么,例如在它上面调用String#succ,它不会影响某些符号,例如你的哈希键。此外,如果您查看String#succ的文档,它会说
succ - > new_string
... so String#succ创建另一个String对象并在该String对象上调用intern(),顺便说一句,intern()只是to_sym()的同义词,再一次不会影响某些符号......它甚至不会影响to_s返回的String对象。
最后,intern()不会更改第二个字符串对象,而是返回一个符号:
a String
V
key.next => key.to_s.succ.intern => Symbol
^
another String
...因为你没有对intern()返回的符号做任何事情,所以它被丢弃了。