ハッシュとは
キーとバリューで構成されているオブジェクト。 キーに文字列かシンボルを使うなら、シンボルのほうがいいよねという感じ(書き方も省略できるし、処理もシンボルのほうが値を高速に取り出せる)
colors = {red: "赤", blue: "青"} colors[:red] #=>赤
上記の形が一般的で、省略形の書き方。 キーがシンボルの場合上記のように書ける。
文字列をキーにもできる(同一ハッシュ内で一つを文字列、一つをハッシュなどの混合はよろしくない)
colors = {"red" => "赤", "blue" => "青"} colors = {"red" => "赤", :blue => "青"} # よくない例 colors = { "red" => "赤" "blue" => "青" "yellow" => "黄" } #こんな書き方もできる
省略形に至るまでの書き方は以下。
colors = {:red => "赤", :blue => "青"} # シンボルをキーとしたハッシュ
colors = {:red "赤", :blue "青"} # ハッシュロケット(=>)を省略
colors = {red: "赤", blue: "青"} # キーのダブルコロン(:)を後ろにもってくる
ハッシュに値を追加
colors[:yellow] = "黄色" colors => {:red=>"赤", :blue=>"青", :yellow=>"黄色"}
ハッシュの値をキーを使って取り出す
colors[:yellow] => "黄色"
ハッシュの値にシンボルを格納
colors = {red: "赤", blue: "青", yellow: "黄色", green: :deep_green} #値もシンボル
シンボルとは
使い方も定義も文字列と似ているオブジェクト。
- 文字列と比べ、処理速度が速い
- シンボルに破壊的変更はできない(エラーになる)
- 破壊的変更ができないので思わぬエラーに遭遇しない(参照)
- 値が同じであれば同じオブジェクト
文字列と違うところは
- 値が同じのものがあれば同一オブジェクト(文字列はそれぞれ別のオブジェクト)
a = :name b = :name a.object_id => 72028 b.object_id => 72028 # 同じオブジェクト
キーワード引数とは
ハッシュのキーで省略形シンボルの記法と似たメソッドの引数の記法。 デフォルト値有り、無しの定義パターンがある。 コードの可読性が上がる。 シンボル、ハッシュとは無関係
def color_changer(main_color, red: true, blue: true) #実引数はデフォルト値 end color_changer("green", red: true, blue: false) #仮引数側だけ見ても何をtrueか何をfalseか想像しやすい
実引数のデフォルト値で良いならメソッド呼び出し時引数省略可能
color_changer("green", red: true)
メソッド実引数のキーワード引数のデフォルト値省略
def color_changer(main_color, red: , blue: ) end
シンボルの省略形っぽいけどキーワード引数のデフォルト値がない記法。 キーワード引数。 メソッド呼び出しの時にデフォルト値がないキーワード引数を省略するとエラー
color_changer(main_color, red:true) #エラー
キーワード引数を使っているメソッドの引数には、仮引数でハッシュを渡すことができる
mix_color = {red: true, blue: true, yellow: true} def color_changer(main_color, red: , blue: ,yellow:) end color_changer("green", **mix_color)
メソッド定義時の実引数にないハッシュを渡すことはできない、メソッド定義時に渡せる引数を定義しないといけない
mix_color = {red: true, blue: true, yellow: true} def color_changer(main_color, red: , blue:) end color_changer("green", red: false, blue: false, **mix_color) #ArgumentError
まとめ
文字列とシンボルは似ているもの ハッシュにおいて、シンボルをキーにすると書き方を省略できるし、文字列かシンボルで選ぶならシンボルがキーの方がベター。 ハッシュでシンボルをよく使っているからシンボルに値が格納できると思い込んでいたけど、ハッシュだから値が格納できていた。キーでシンボルを使っていただけ、ハッシュそのものとシンボルは別物。
文字列と似ているもの。
配列は値を格納するオブジェクト、ハッシュはキーとバリュー(値)をセットで格納するオブジェクト。
わかったこと
・シンボルは同じ値であれば同じオブジェクト(参照のこと)(一方、文字列は値が同じものがあろうがそれぞれ別のオブジェクト) ・イミュータブル(破壊的変更不可)
メソッドのキーワード引数はキーがシンボルのハッシュの形
感想
キーワード引数とハッシュのキーがシンボル、かつ値がシンボルとなった時の挙動がわかりきってないのでまたこの章に戻ってきます。