1
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

Ruby で ? の付くメソッドは true/false を返す,とは限らない

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

みたいな場面で使われることがありました。
これなどまさに述語メソッドとしての使い道だったと言えるでしょう。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
1
Help us understand the problem. What are the problem?