変数名やブロック引数をアンダースコア1文字にするイディオム
はじめに
この記事は書籍「プロを目指す人のためのRuby入門」に掲載できなかったトピックを著者自らが紹介するアドベントカレンダーの1日目です。
本文に出てくる章番号や項番号は書籍の中で使われている番号です。
今回は変数名やブロック引数をアンダースコア1文字にするイディオムを紹介します。
必要な前提知識
「プロを目指す人のためのRuby入門」の第4章まで読み終わっていること。
変数名やブロック引数をアンダースコア1文字にするイディオム
「2.2.8 変数(ローカル変数)の宣言と代入」で説明したとおり、Rubyでは変数名をアンダースコアで始めることができます。
アンダースコアで始めることができるということは、アンダースコア1文字の変数名でも有効、ということです。
# アンダースコア1文字の変数の宣言と参照
_ = 123
_ #=> 123
通常はこのような変数を使うことは滅多にありません。
ですが、ときどき「とりあえず代入はするが、使わない変数」の意味でアンダースコア1文字の変数が使われることがあります。
str = "Alice,Female,20"
# 文字列を名前と性別と年齢に分割するものの、使うのは年齢だけ
_, _, age = str.split(',')
age #=> "20"
# ただし上のコードはあくまで説明用。本当はこう書いた方が明示的
age = str.split(',').last
ブロック引数でも同じような用途で使われることがあります。
currencies = { 'japan' => 'yen', 'us' => 'dollar', 'india' => 'rupee' }
# キーと値のうち、値しか使わない
currencies.map { |_, v| v.upcase } #=> ["YEN", "DOLLAR", "RUPEE"]
# ただし上のコードはあくまで説明用。本当はこう書いた方が明示的
currencies.values.map(&:upcase) #=> ["YEN", "DOLLAR", "RUPEE"]
ですが、このような変数を積極的に使うべきかというと、そうではありません。
上のコードでも示したように、アンダースコアを使わず明示的に書く方法があれば、そちらを使うべきです。
とはいえ、他の人が書いたコードの中にこうしたテクニックが使われていることはありえるため、頭の片隅に置いておくのは良いと思います。
次回予告
次回はメソッドの引数をアスタリスク1文字にするイディオムを紹介します。
- Linked from these articles
- Linked from
いいねユーザーランキング(毎日自動更新)
アンダースコア + 変数名 (例:
_name, _gender, age = str.split(',')
)というパターンもどこかで見たのですが、これは実際には使われますか?アンダースコア1文字よりも何の値を使わないと判断したのかが明確になって良いと思ったのですが、いかがでしょうか。
@chooyan_eng さん
うーん、アンダースコアのみ、もしくはアンダースコアで始まる変数名の使い方や意味づけは、人によってバラけることがあります。
これ自体はあくまで慣習的なものであり、別にRuby自身がアンダースコアの意味を規定しているわけではないので。
そうですね。そういう判断もできると思います。
実際、Rubyスタイルガイドではそのように説明されているようです。
https://techracho.bpsinc.jp/hachi8833/2016_12_27/32100#2-06
とはいえ、これもまた「絶対」のルールではないので、そうする人はそうするし、そうしない人はそうしない、ということになります。
結局のところ、アンダースコア始まりの変数名をどう扱うかは、ご自身の開発の現場でポリシーを決めてもらうということになると思います。
@jnchito さん
なるほどー。現場次第ということですね。
そのあたりも気にしながらいろいろとコードを読んでみようと思います。
スタイルガイドも教えていただきありがとうございます!
多重代入の最後の変数としてアンダースコア1文字を入れるくらいなら、どうせ捨てられるから書かない方が良い、みたいなのも考えるポイントとしてあるのですね。