Ruby のメソッドは,名前が ?
で終わっていてもよいことになっています。
実際,組込みクラスには String#empty? とか Array#include? といったメソッドがあります。
述語メソッド,つまり返り値の真・偽を利用するためのメソッドにこのような命名をする慣習があります。これはルールではなく慣習です。
ところで,
Ruby の真/偽と true/false は違う - Qiita
にも書いたのですが,Ruby では真・偽を表すのに,必ずしも true
/false
を使うわけではありません。
実際,組込みの述語メソッドで,true
/false
以外を返すものもあります。
例えば String#casecmp? は大文字/小文字の違いを無視して一致判定するもので,基本的に true
/false
を返しますが,文字列のエンコーディングが非互換の場合は nil
を返す仕様になっています。
なお,「述語メソッド」を「返り値の真偽性を利用するためのメソッド」とするならば,これはメソッド自体の仕様ではなく利用側の目的による括りなので,線引きはやや曖昧性があると私は考えています。
たとえば,Regexp#match は,引数の中に自身にマッチする部分文字列を見出したときは MatchData オブジェクトを返し,そうでないとき nil
を返す仕様ですが,Ruby 2.4 で Regexp#match? が登場するまでは,
if /\d/.match(str)
# 云々
end
みたいな場面で使われることがありました。
これなどまさに述語メソッドとしての使い道だったと言えるでしょう。