Rubyのメソッド名につく?(クエスチョンマーク)について


はじめに

末尾に ? がついているメソッドをよく見かけるけど、どういう役割なんだろう?と気になった

そもそも ? はどこで使われるているの?

def xx?
この場合の「?」はメソッド名の一部分です。慣用的に、真偽値を返すタイプのメソッドを示すために使われます。

(引用: Rubyリファレンス

つまり ? まで含んだものがメソッド名になるということ

def test?
  true
end

[1] pry(main)> test1?
=> true

例えばArrayクラスだと

include?empty? などのインスタンスメソッドがこれに相当する

末尾以外でも使える?

識別子というわけではないみたいから、句中には入れられない

[1] pry(main)> def test?1
SyntaxError: unexpected tINTEGER, expecting ';' or '\n'
def test?1

じゃあ ? をつけたら真偽値を返すようになるのか?

def test2?
  p "test2"
end

[1] pry(main)> test2?
"test2"
=> "test2"

否、 ? をつけたメソッドでも自動的に真偽値が返るわけではないみたい

スタイルガイドでは

The names of predicate methods (methods that return a boolean value) should end in a question mark (i.e. Array#empty?). Methods that don’t return a boolean, shouldn’t end in a question mark.

# bad
def even(value)
end
# good
def even?(value)
end

(日本語訳)述語メソッド(ブーリアン値を返すメソッド)の名前は、クエスチョンマークで終わるべきです(例:Array#empty? 真偽値を返さないメソッドは、クエスチョンマークで終わるべきではありません。

真偽値を返すメソッドを自作するときは、末尾に ? をつけるようにしようぜ!ということみたい

つまり

  • 真偽値を返すメソッドは 末尾に ? をつけるべし
  • ?をつけたところで、返り値が変わるわけではない

追記

コメントいただいた内容が勉強になったので追記します

Rubyでの「真偽値」は単にtrue/falseを表すものではなく、
真偽性を利用するための値として扱われるため、?のつくメソッドの返り値はtrue/falseには限られないようです。

また?のつくメソッドを述語メソッドと呼ぶようです

述語メソッド
predicate method
返り値を真偽値として用いるためのメソッド。メソッド名の末尾に ? を付ける習慣がある。

参考記事URL