rubyシルバーを勉強していくなかで、hashについてちゃんとわかっていなかった今回は解説させていただこうとおもいます。
##ハッシュって?
ハッシュとは、配列と似ていますが、keyというものと、valueというものがある配列です。
具体的に、コードを見ていきましょう!
hash = {'Satou' => 19, 'Hashimoto' => 35, 'Yamada' => 23}
こういうふうな書き方をします。
keyというものが、Satou, Hashimoto, Yamadaです。
valueというものが、19, 35, 23です。
このハッシュのメリットが、keyを目印にして、valueを取得することができるんです。
これと似たものに配列というものがあります。
配列は、0,1,2のような数字で値を取得するような書き方をするんですね。
ハッシュの方が直感的でいいですね。
##ハッシュの値の取り方
先ほどのコードを書いてみましょう
hash = {'Satou' => 19, 'Hashimoto' => 35, 'Yamada' => 23}
#keyを全部取得して、それを配列で返す。
hash.keys
=> ["Satou", "Hashimoto", "Yamada"]
#valueを全部取得して、それを配列で返す。
hash.values
=> [19, 35, 23]
#あるvalueに対応した、keyを取得
hash.key(19)
=> "Satou"
##あるkeyに対応した、valueを取得し、それを配列で返す。
hash.values_at('Satou')
=> [19]
hash.['Satou']
=> 19
そのほかの値の取得方法もありますので、気になる方は、こちらを参考にしてください!
##シンボルについて
シンボルとは、「:」という書き方です。
では公式ドキュメントになんて書いてあるんでしょうか?
Rubyの内部実装では、メソッド名や変数名、定数名、クラス名などの`名前'を整数で管理しています。これは名前を直接文字列として処理するよりも速度面で有利だからです。そしてその整数をRubyのコード上で表現したものがシンボルです。
シンボルは、ソース上では文字列のように見え、内部では整数として扱われる、両者を仲立ちするような存在です。
名前を管理するという役割上、シンボルと文字列は一対一に対応します。また、文字列と違い、immutable (変更不可)であり、同値ならば必ず同一です。
公式ドキュメントより
つまり、見た目上は、文字列でも、中身は数字なんですね。
これの何がいいのか?僕個人的には、一番のメリットは処理速度が速いということだとおもいます。
他にメリットがありますので、それを知りたい方はこちらを参照してみてください。
##実際のコードを見ていきましょう
#書き方➀
hash = {:'Satou' => 19, :'Hashimoto' => 35, :'Yamada' => 23}
puts hash[:'Satou']
# 19
#書き方➁
hash = {'Satou': 19, 'Hashimoto': 35, 'Yamada': 23}
puts hash[:'Satou']
# 19
#値の取り方は、上のコードと同じようにとれる
##実際に問題を解いてみよう
この問題では、
klassという変数に、Classクラスから新しいインスタンスを作成して、そのオブジェクトを代入します。
そして、そのkeyであるオブジェクトに、valueの100を作ります。つまり、ハッシュをつくります。
3行目では、上のコードでも書いたような書き方で書かれていますね。
つまり、keyに紐づいた、valueを取得しています。
このコードを実行すると、取得できる値は、
klass = Class.new
hash = {klass => 100}
puts hash[klass]
# 100
100が出てくるような選択肢を選べばいいんですね。
###選択肢を見ていきましょう
####選択肢1
klass = Class.new
hash = {klass: 100}
puts hash[klass]
1行目までは同じですね。
2行目もハッシュの書き方➁の書き方です。
3行目をよく見てみると、値の取り方が違いますね。もし、100を取りたかったら、
puts hash[:klass]
と書くべきですね。
選択肢1の値の取り方をすると、nilになるんです。
####選択肢2
klass = Class.new
hash = {}
hash.store(klass, 100)
puts hash[klass]
2行目で、空のハッシュを作ります。
3行目でstoreメソッドを使ってます。storeとは英語で「格納する」という意味です。
つまり、hashにklassをkeyに、valueを100としたhashを作ります。コードで書くなら、
{#<Class:0x00000000086b8660>=>100}
そして4行目で、keyに対応したvalueを取得してます。この書き方は、「ハッシュの値の取り方」の最後に書いてあります。
このコードを実行すると、100が取得できるので、1つ目の正解です
####選択肢3
ここまで読んでいただいた方であれば、選択肢3はnilになることが分かるとおもいます。
選択肢1の解説を読んでいただければわかるとおもいます。
####選択肢4
ここまで読んでいただいた方であれば、選択肢4は100になることが分かるとおもいます。
2行目のHashメソッドは、新しいハッシュを作成してくれるというメソッドです。
以上です。
何か間違いがございましたら、ご教示いただけますと幸いです。
【参考文献】