Just do IT

思うは招く

[Ruby] 引数に複数の値を持たせてハッシュに入れる

Rubyでは、引数にアスタリスク2つ**をつけると、ハッシュに格納できる。 これは見たほうがわかりやすい。

def hello_with_options(msg, **opts)
  name = opts[:name]
  name2 = opts[:name2]
  time = opts[:time] || Time.now
  puts "#{msg} #{name} and #{name2} @ #{time}"
end
hello_with_options("Hello!", name: "Ruby", name2: "PHP")
=> Hello! Ruby and PHP @ 2019-12-13 09:29:00 +0900

**optsこのように引数をもたせると、この場合はoptsというハッシュが生成される。そしてメソッドの中でキーを持たせて使うことができる。

name = opts[:name]

この場合、optsというハッシュの:nameというシンボルのキーの値を、nameに代入している。

p opts
=> {:name=>"Ruby", :name2=>"PHP"}

では、:nameの値がなぜ”Ruby”になるのかというと、メソッドを使うときに引数で指定しているためだ。

hello_with_options("Hello!", name: "Ruby", name2: "PHP")

具体的にはここ。

name: "Ruby"

また、ハッシュなので複数のデータを格納できるため、name2: "PHP"と入れてみた。

name2: "PHP"

@以降に出力した時間も代入しているため、こんな感じに表示される。

Hello! Ruby and PHP @ 2019-12-13 09:29:00 +0900