2017-05-27 118 views
-3

因此,在基本Ruby中,我试图弄清楚如何将字符串转换为散列或将字符串放入散列。我想要pokemon项目作为键和值的整数。如何将字符串转换为散列或将其添加到散列

事情是这样的:

hash = {} 
pokemon_list = "pikachu charizard jigglypuff bulbasaur" 

def create_poke_list(string) 
    hash << string.split 
end 
create_poke_list 

预期输出:

hash 
#=> {"pikachu"=>0, "charizard"=>0, "jigglypuff"=>0, "bulbasaur"=>0} 
+2

你对“皮卡丘charizard jigglypuff bulbasaur”字符串有什么期望? – MikDiet

+2

请编辑您的问题,以显示给定字符串“pokemon_list”所需的返回值(散列)。 –

回答

3
pokemon_list.split.product([0]).to_h 
    #=> {"pikachu"=>0, "charizard"=>0, "jigglypuff"=>0, "bulbasaur"=>0} 

步骤:

a = pokemon_list.split 
    #=> ["pikachu", "charizard", "jigglypuff", "bulbasaur"] 
b = a.product([0]) 
    #=> [["pikachu", 0], ["charizard", 0], ["jigglypuff", 0], ["bulbasaur", 0]] 
b.to_h 
    #=> <hash shown above> 

或者,

Hash[pokemon_list.split.product([0])] 

这里Array#product只是一个pokeman_list.zip(a)其中a是由pokenman_list.size相等的元素,这里零阵列速记形式。另请参阅Enumerable#zip

或使用String#gsub

这是另一种不需要将字符串转换为数组的方式。

pokemon_list.gsub(/[[:alpha:]]+/).with_object({}) { |w,h| h[w] = 0 } 
    #=> {"pikachu"=>0, "charizard"=>0, "jigglypuff"=>0, "bulbasaur"=>0} 

这工作,因为gsub当不使用块执行返回一个枚举。无可否认这是该方法的一种不寻常用法(因为它不能替换字符串中的字符),但有时候我发现它很有用。

+1

我认为这是一个很好的答案,但它需要解释为什么#产品比“Hash.new(0)”更有意义。你和我知道它为什么有效,但#产品对于大多数人来说是一种非直观的选择。 :) –

+0

@CodeGnome,感谢您的建议。我做了一个编辑,但我没有看到'Hash.new(0)'是如何被用来获得优势的。 –

0

如果您需要被初始化为0默认值的哈希值,你可以简单地做

hash = Hash.new(0) 
p hash["pikachu"] 
#=> 0