はじめに

この記事は書籍「プロを目指す人のためのRuby入門」に掲載できなかったトピックを著者自らが紹介するアドベントカレンダーの12日目です。
本文に出てくる章番号や項番号は書籍の中で使われている番号です。

今回は配列リテラルで最後の要素をハッシュにする場合のTipsを紹介します。

必要な前提知識

「プロを目指す人のためのRuby入門」の第5章まで読み終わっていること。

配列リテラルで最後の要素をハッシュにする場合のTips

配列のおさらい

4.2節でも説明したとおり、Rubyの配列では異なるデータ型を混在させることができます。

# 数値と文字列を混在させた配列を作成する
a = [1, 'apple', 2, 'orange', 3, 'melon']

なので、配列の要素としてハッシュを混在させることも可能です。

# 2番目の要素をハッシュにする
a = [1, {'apple' => 2, 'orange' => 3}, 'melon']
a[1] #=> {"apple"=>2, "orange"=>3}

最後の要素をハッシュにする場合

ところで、5.6.5項では「メソッドの最後の引数がハッシュであればハッシュリテラルの{}を省略できる」というルールを説明しました。

# {}付きでメソッドを呼び出す
buy_burger('fish', {'drink' => true, 'potato' => false})

# {}なしでメソッドを呼び出す
buy_burger('fish', 'drink' => true, 'potato' => false)

配列リテラルでも同じように、最後の要素がハッシュであればハッシュリテラルの{}を省略できます。

# {}付きで最後の要素をハッシュにする
a = ['fish', {'drink' => true, 'potato' => false}]
a #=> ["fish", {"drink"=>true, "potato"=>false}]

# {}なしで最後の要素をハッシュにする
b = ['fish', 'drink' => true, 'potato' => false]
b #=> ["fish", {"drink"=>true, "potato"=>false}]

さらに、**を使えば変数に入れたハッシュも最後の要素のハッシュに含めることができます。

options = {salad: true, chicken: false}

# **を使って最後の要素のハッシュにoptionsの内容を含める
c = ['fish', 'drink' => true, 'potato' => false, **options]
c #=> ["fish", {"drink"=>true, "potato"=>false, :salad=>true, :chicken=>false}]

# **がないと構文エラーになる
d = ['fish', 'drink' => true, 'potato' => false, options]
#=> SyntaxError: (irb):47: syntax error, unexpected ']', expecting =>
#   e, 'potato' => false, options]
#                                 ^

このあたりの考え方はメソッドの引数の順番によく似ているので、「コラム:メソッド定義時の引数の順番(172ページ)」もあわせて読んでおきましょう。

利用例

この構文はそんなに頻繁に使われるものではありませんが、たとえば「Rails❤️SQLのサンプルコード」の中では次のようなコードが登場します。

args = [
  sql,
  date_from: date_from,
  date_to: date_to,
  name: name,
]
query = ApplicationRecord.send(:sanitize_sql_array, args)
ApplicationRecord.connection.execute(query)

argsの中身をよく見ると、date_fromからnameまでがハッシュになっていることがわかるはずです。

次回予告

次回は文字列をfreezeさせるいくつかの方法を紹介します。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.