2017-05-27 14 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

'' pikachu charizard jigglypuff bulbasaur ''stringにはどんな結果が期待されますか? – 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#productaはここpokenman_list.size等しい要素、ゼロから成るアレイであるpokeman_list.zip(a)のわずか手の形です。 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

これは良い答えだと思うが、なぜ#productが 'Hash.new(0)'よりも理にかなっている理由を説明する必要がある。あなたと私はそれがなぜ機能するのかを知っていますが、#productはほとんどの人にとって直感的ではありません。 :) –

+0

@ CodeGome、提案に感謝します。私は編集を行いましたが、 'Hash.new(0)'がどのように利用されるのか分かりません。 –

0

あなたが0のデフォルト値で初期化されたハッシュが必要な場合は、単に

hash = Hash.new(0) 
p hash["pikachu"] 
#=> 0 
関連する問題