LoginSignup
0
0

More than 3 years have passed since last update.

ハッシュについて学習したこと

Last updated at Posted at 2020-06-01

ハッシュで使用頻度の高いメソッド

keysメソッド

ハッシュのキーを配列として返すメソッド

keyメソッド
languages = { japan: 'Japanese', us: 'English', india: 'Hindi' }
languages.keys #=>[:japan, :us, :india]  

valuesメソッド

ハッシュの値を配列として返すメソッド

valuesメソッド
languages = { japan: 'Japanese', us: 'English', india: 'Hindi' }
languages.values #=> ["Japanese", "Enlgish", "Hindi"]

has_key?メソッド

ハッシュの中に指定されたキーが存在するかどうか確認するメソッド
※エイリアスメソッドとして、key?, include?, member? があります。

has_key?
languages = { japan: 'Japanese', us: 'English', india: 'Hindi' }
languages.has_key?(:japan) #=> true
languages.has_key?(:italy) #=> false

**でハッシュを展開

**をハッシュの前に付けるとハッシュリテラル内でほかのハッシュのキーと値を展開できる

**
h = { us: 'English', india: 'Hindi' }
{ japan: 'Japanese', **h } #=> {japan: 'Japanese', us: 'English', india: 'Hindi'}
#mergeメソッドを使っても同じ効果が得られる
{ japan: 'Japanese'}.merge(h) #=> {japan: 'Japanese', us: 'English', india: 'Hindi'}

配列とハッシュ

to_aメソッド

ハッシュをto_aメソッドを使って配列に変換するメソッド

to_a
languages = { japan: 'Japanese', us: 'English', india: 'Hindi' }
languages.to_a #=> [[:japan, "Japanese"], [:us, "English"], [:india, "Hindi"]]

to_hメソッド

配列をハッシュに変換することができるメソッド

to_h
array = [[:japan, "Japanese"], [:us, "English"], [:india, "Hindi"]]
array.to_h #=> {:japan=>"Japanese", :us=>"English", :india=>"Hindi"}
#ハッシュとして解析不能な配列に対してto_hメソッドを呼ぶとエラーになる
array = [5, 6, 7, 8]
array.to_h #=> TypeError: wrong element type Integer at 0 (expected array)
#キーが重複したりすると思いがけないエラーになる
array = [[:japan, "Japanese"], [:japan, "日本語"]]
array.to_h #=> {:japan=>"日本語"}

Hash[]に対して渡すことで配列に変換することもできる

Hash[]
array = [[:japan, "Japanese"], [:us, "English"], [:india, "Hindi"]]
Hash[array] #=> {:japan=>"Japanese", :us=>"English", :india=>"Hindi"}

ハッシュの初期値

h = Hash.new('OK')
a = h[:aaa] #=> "ok"
b = h[:bbb] #=> "ok"

#変数aと変数bは同一オブジェクト
a.equal?(b) #=> true

#変数aに破壊的な変更をすると、変数bの値も一緒に変わってしまう
a.upcase!
a #=> "OK"
b #=> "OK"
ブロックを使う
h = Hash.new{'OK'}
a = h[:aaa] #=> "ok"
b = h[:bbb] #=> "ok"

#変数aと変数bは異なるオブジェクト
a.equal?(b) #=> false

#変数aに破壊的な変更を適用しても、変数bの値は変わらない
a.upcase!
a #=> "OK"
b #=> "ok"

参考文献
プロを目指す人のためのRuby入門

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0