Ruby哈希中的增量

时间:2014-05-21 00:53:07

标签: ruby hashmap

我试图在散列中增加密钥。例如。我试图搞定这个

{: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

5 个答案:

答案 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()返回的符号做任何事情,所以它被丢弃了。