はじめに
末尾に ?
がついているメソッドをよく見かけるけど、どういう役割なんだろう?と気になった
そもそも ?
はどこで使われるているの?
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