💡

「?」、「!」で終わるメソッド(Ruby)

2024/02/02に公開

はじめに

今回は?や!で終わるメソッドを見ていきます。
Rubyのメソッド名は?や!で終わらせることができます。
?も!もこれだけで意味をもっているので、しっかり見ていきましょう!

?で終わるメソッド

?で終わるメソッドは慣習として真偽値(trueかfalse)を返すメソッドになっています。
このようなメソッドのことを述語メソッドと言います。
Rubyで最初から用意されている述語メソッドの中から、いくつかの例を見てみましょう。

# 空文字列であればtrue、そうでなければfalse
 ''.empty?     #=> true
 'abc'.empty?  #=> false

 # 引数の文字列が含まれていればtrue、そうでなければfalse
 'watch'.include?('at') #=> true
 'watch'.include?('in') #=> false

 # 奇数ならtrue、偶数ならfalse
 1.odd?  #=> true
 2.odd?  #=> false

 # 偶数ならtrue、奇数ならfalse
 1.even? #=> false
 2.even? #=> true

 # オブジェクトがnilであればtrue、そうでなければfalse
 nil.nil?   #=> true
 'abc'.nil? #=> false
 1.nil?     #=> false

!で終わるメソッド

!で終わるメソッドは、!が付いていないメソッドよりも危険という意味を持ちます。
よって、!で終わるメソッドを使うときは注意が必要です。

たとえば、Stringクラスにはupcaseメソッドとupcase!メソッドという2つのメソッドがあります。
どちらも文字列を大文字にするメソッドですが、
upcaseメソッドは大文字に変えた新しい文字列を返し、呼び出した文字列自身は変化しません。
それに対し、upcase!メソッドは呼び出した文字列自身を大文字に変更します。

a = 'ruby'

 # upcaseだと変数aの値は変化しない
 a.upcase  #=> "RUBY"
 a         #=> "ruby"

 # upcase!だと変数aの値も大文字に変わる
 a.upcase! #=> "RUBY"
 a         #=> "RUBY"

変数には!や?は使えない

ちなみに、メソッド名は!や?で終わることができますが、
変数名には!や?を使えない点に注意してください(構文エラーになります)。

# ?で終わる変数名を定義しようとすると構文エラー
 odd? = 1.odd?
 #=> syntax error, unexpected '=' (SyntaxError)
 #   odd? = 1.odd?
 #        ^

 # !で終わる変数名を定義しようとすると構文エラー
 upcase! = 'ruby'.upcase!
 #=> syntax error, unexpected '=' (SyntaxError)
 #   upcase! = 'ruby'.upcase!
 #           ^

さいごに

今回は!と?で終わるメソッドについて見てきました!
これらの意味を理解して、焦らず対応していきたいですね!

参考文献

プロを目指す人のためのRuby入門 改訂2版

Discussion