3
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 7

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

Posted at

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

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

3
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
3
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?