rubyを学習していた中で、ハッシュとキーワード引数の違いがよくわかっていなかったので、備忘録としてメモに残しておきます。
ハッシュとキーワード引数の違いについて
そもそもハッシュとは何ぞや
ハッシュは、複数の値をまとめて管理する方法の1つで、配列以外の方法。
ハッシュの作り方には3パターンある
1 2 3 |
user = {"name" => "nanami", "age" => 100} user = {:name => "nanami", :age => 100} user = {name: "nanami", age: 100} |
いずれの方法でも共通しているのが{}で囲うことと、複数の値をまとめて管理するので「変数に代入している」点である。
そして、ハッシュの各要素の値は対応する「キー」を使うことで呼び出すことができる。
1 2 |
puts user[:name] # =>nanami |
キーはシンボルで呼び出すことができるので、とても配列的だと感じるね。
一方でキーワード引数
キーワード引数はあくまで「引数」なので、引数のなかで定義する
1 2 3 |
def introduce(name:,age:,weight:) end |
で、このときに勘違いしやすいのが「キーワード引数=シンボル?」ということである。実際に書いてみるととても混同
1 2 3 4 5 6 |
def introduce(name ,age: 100,weight: 100) # なぜ :ageではないのか if age # ... end end |
シンボルはあくまで「”文字列”」のものを「:文字列」であらわした(もちろん厳密には違う)ので、シンボルを使うことはない。
キーワード引数はあくまでもメゾットの引数(仮引数)なので、そもそもモノが違う、ということ。
ただし、メソッドを呼び出す場合はキーワード引数をシンボルとして扱ってもよい模様。
1 2 3 |
#いずれの記法でも呼び出せる introduce("nanami",age: 60, weight:120) introduce("nanami",:age => 60, :weight => 120) |
ではどのような時にごっちゃになるのか。
1 2 3 4 5 6 7 8 9 10 11 |
def introduce(name: "nanami") # ... end ex = {name: "teruma"} introduce(ex) # ...? introduce(**name) # => "teruma" |