LoginSignup
2
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-03-22

はじめに

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

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

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

2
0
5

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
2
0