Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

はじめに

この記事は書籍「プロを目指す人のための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させるいくつかの方法を紹介します。

jnchito
SIer、社内SEを経て、ソニックガーデンに合流したプログラマ。 「プロを目指す人のためのRuby入門」の著者。 http://gihyo.jp/book/2017/978-4-7741-9397-7 および「Everyday Rails - RSpecによるRailsテスト入門」の翻訳者。 https://leanpub.com/everydayrailsrspec-jp
https://blog.jnito.com/
sonicgarden
「お客様に無駄遣いをさせない受託開発」と「習慣を変えるソフトウェアのサービス」に取り組んでいるソフトウェア企業
http://www.sonicgarden.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした