ときどき,Ruby における命名規則として
メソッド名は小文字で始めなければならない
と書かれた記事を目にしますが,そんなことはありません。
大文字で始めることもできる
以下のように大文字始まりのメソッドを定義することもできます。
def Ruby
puts "Hello, Ruby!"
end
Ruby() # => Hello, Ruby!
メソッド名をアルファベット小文字で始めるのは,文法上のルールではなく慣習なのです。
しかし,大文字始まりのメソッド名を使うとき,注意しなければならない点があります。
上のコードで,Ruby
というメソッドを呼び出すときに Ruby()
のようにして ()
を付けました。
あれれ? ( )
は省略できるんじゃなかったっけ?
はい,そうなんですが,今の場合,()
が無いと「定数の参照」なのか「メソッド呼び出し」なのか区別がつきません。こういう場合,Ruby の処理系は定数の参照と解釈するようになっています(そういう仕様)。
それゆえ,単に Ruby
と書いたのでは
uninitialized constant Ruby (NameError)
というエラーが発生します。
なお,実引数を与えるときは ( )
が省略できます:
def Ruby(message)
puts "#{message}, Ruby!"
end
Ruby "Hello" # => Hello, Ruby!
これはメソッド呼び出しとしか解釈しようがないからです。
組込みクラスのメソッドはどうか
文法上のルールではないにしても,「メソッド名はアルファベット小文字で始める」という慣習があるのなら,組込みクラスや標準添付ライブラリーのメソッドも当然その慣習に則っているのか,というと,実はそうでもありません。
Kernel モジュールのメソッド一覧を眺めると,Array, Complex, Float, Hash, Integer, Rational, String といった大文字始まりのメソッドが目に入ります。
すぐに気がつくように,メソッド名と同名の組込みクラスがありますよね。
これら一群のメソッドは,同名のクラスのインスタンスを生成するためのものです。
たとえば,複素数オブジェクトを生成するのに,Complex.new
を使って
Complex.new(1, 2) # => (1+2i)
としてもいいのですが,
Complex(1, 2) # => (1+2i)
と書くこともできます。
また,組込みではありませんが,標準添付ライブラリーの Pathname クラスでは,Pathname.new("foo/bar")
の代わりに Pathname("foo/bar")
と書くことができます。
これらを初めて見たときは,クラスに引数を付けるとオブジェクトができるという文法でもあるのか,と思いましたが,単にクラスと同名のメソッドが定義されているのでした。
文字数で 4 文字減るだけですが,このほうが簡潔なので私は気に入っています。
自分でクラスを作るときも,目的によってはこのような生成メソッドを合わせて定義しています。
逆に,メソッド名を大文字で始めるのは,このようなケースに限定したほうがいいだろうなと思います。
アルファベット以外も実は OK
ローカル変数名に漢字や仮名が使えるのと同じく,メソッド名にも使えます。
def ビール飲みたい(回数)
puts ["ビール飲みたい"] * 回数
end
ビール飲みたい 3
# => ビール飲みたい
# ビール飲みたい
# ビール飲みたい
蛇足でした。
最後に
この記事は 2020 年のアドベントカレンダー
【初心者必読】Ruby の誤解あるある Advent Calendar 2020
の最後の記事です。
2021 年のじゃなくて 2020 年ね! 投稿したのは 2021 年 11 月だけど。
Qiita のアドベントカレンダーは,アドベント期間が終っても投稿できるみたい。
アドベント期間中にすべての日付を埋めることができなかったので,年が変わっても少しずつ記事を足していって,今日ようやく最後の日付(12/1)を埋めることができました。一年かかった。
自分としては,Ruby の初心者のよくある誤解の総まとめ的な,それなりに役に立つ記事群のつもりでしたが,今日の時点で LGTM の総数がたった 15 という壊滅的に淋しい企画に終わりました