Ruby のモジュール関数は,これまで「Math.#sin」のように表示されてきたが,今後は「Math?.sin」と書くらしい,という話。
モジュール関数とは
モジュール関数というのは
モジュールのインスタンスメソッドおよび特異メソッドとして二重に定義されているメソッド。
のこと。
たとえば,三角関数の一つである sin は,Math モジュールのインスタンスメソッドなので,
include Math
p sin(3.141592653589793238 / 2)
# => 1.0
のように,include した先で使うことができるし,Math モジュールの特異メソッドでもあるので
p Math.sin(3.141592653589793238 / 2)
# => 1.0
という形で使うこともできる。
メソッドの表示方法
「Array クラスのインスタンスメソッドである length」をいちいちそのように書くのは冗長で面倒だ。
そこで,これを「Array#length」と書く慣習がある。
こう書いてあれば「Array クラスのインスタンスメソッドである length」のことね,と分かることになっている。
これは Ruby スクリプトの中で書くものではなくて,あくまでメソッドについてのコミュニケーションの中で用いる表記だし,「広く行われている慣習」に過ぎない。
一方,「File クラスの特異メソッドである exist?」については「File.exist?」と書く慣習がある。
こちらはメソッド呼び出しの書き方と同じ . を使う(ので覚えやすくもある)。
そして,本記事のテーマでもあるモジュール関数の場合,「Math モジュールのモジュール関数である sin」は「Math.#sin」と書く慣習があった。
記号「#」「.」「.#」を使ったこれらの表記は Ruby の公式リファレンスマニュアルなどでも使われてきた。
ここがポイント。「単なる慣習」とはいえ,公式リファレンスで採用されているので,ある意味「公式の表示方法」と言えそう。
モジュール関数の表記が変わった
さて,そのモジュール関数だが,記事タイトルにもあるとおり,これからは「Math.#sin」ではなく「Math?.sin」と書くらしい。
記号が「.#」から「?.」に変わった。
公式リファレンスでは,既に 4.0 版1からこの表記が採用されている。
たとえば Math?.sin を見てほしい。
一方で,3.4 版までは Math.#sin のまま。
そういう方針がとられたようだ。
表し方が違うだけなので,どちらの表記を見ても「ああモジュール関数なのね」と分かるようになっておこう。
なんでこうなった
(この節,あとで追記します)
-
リファレンスマニュアルの「4.0 版」というのは,「Ruby 4.0.x 対応版」という意味。書籍のような刊行サイクルとしての「版」ではない。 ↩