ハッシュとは
・複数の値をキーとバリュー{key: "value"}の形で持つことができる
{fruits: "apple"}の場合キーが:fruitsでバリューが"apple"
・連想配列とも呼ばれる
ハッシュのとり方
test.rb
①
p = { "key" => "value" }
=> {"key"=>"value"}
②
p = { :key => "value" }
=> {:key=>"value"}
③
p = { key: "value"}
=> {:key=>"value"}
④
p = {key: :value}
=> {:key=>:value}
・『:』はsymbol型、『""』はstring型
・①②はハッシュロケット(=>)を使った記法。古い書き方。基本的には③④が推奨されている。
=>だと記述量も増え、読みづらいコードになるため。またシンボルの方が実行速度が早い
引数にハッシュを使う場合
test.rb
def self.fruits_price (apple: "100", orange: "200")
p "#{:apple} #{apple}円"
p "#{:orange} #{orange}円"
end
-----------------------------------------------------
#コンソール
#pry(main)> Test.fruits_price
#"apple 100円"
#"orange 200円"
#=> "orange 200円"
{}は省略できる
test.rb
def self.fruits_price apple: "100", orange: "200"
p "#{:banana} #{banana}円"
end
-----------------------------------------------------
#コンソール
#NameError: undefined local variable or method `banana' for #<Class:0x007febae21cf18>
ハッシュに設定していない値を取ろうとするとエラーになる
ハッシュのSymbol型とString型
シンボル(Symbol)とは
・名前という概念を表すオブジェクト
・『:』をつける
・内部では整数で管理され、コード上では文字列のように表現される
・同じ内容のシンボルはかならず同一のオブジェクトになる
ストリング(String)とは
・文字列を表すオブジェクト
・引用符で囲った文字列リテラルを使う
・同じ内容の文字列でも、管理する整数値は異なる
test.rb
#シンボルの場合
a = :hoge
b = :hoge
a.equal?(b)
#=> true
a.object_id
#=> 13212508
b.object_id
#=> 13212508
#ストリングの場合
a = "hoge"
b = "hoge"
a.equal?(b)
#=> false
a.object_id
#=> 70325103742880
b.object_id
#=> 70325061551180
シンボル(Symbol)とストリング(String)の使い分け
・シンボルは何度使っても同一の値であるためメモリを圧迫しない
・名前や住所、メッセージなど文字列自身がデータの場合はストリングを使う
・ハッシュのキー、メソッドに渡すクラス名/メソッド名/変数名/定数名、ステータス名(性別・国籍)など文字列自体がデータではないときにシンボルを使う
ハッシュを結合する
mergeメソッドを使うとハッシュを結合できる
test.rb
hash1 = {fruits: "apple"}
#=> {:fruits=>"apple"}
hash2 = {price: "100"}
#=> {:price=>"100"}
hash3 = hash1.merge(hash2)
#=> {:fruits=>"apple", :price=>"100"}
ただしすでに存在するキー(シンボル・ストリングに関わらず)を使うと、ハッシュの更新として処理される。
test.rb
hash1 = {fruits: "apple", meet: "beef"}
#=> {:fruits=>"apple", :meet=>"beef"}
hash2 = {fruits: "orange"}
#=> {:fruits=>"orange"}
hash3 = hash1.merge(hash2)
#=> {:fruits=>"orange", :meet=>"beef"}