11
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【初心者必読】Ruby の誤解あるあるAdvent Calendar 2020

Day 1

Ruby のメソッド名は小文字で始めなければならない,わけじゃない

Posted at

ときどき,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 という壊滅的に淋しい企画に終わりました :sob:

11
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?