RailsやRubyを使っていると、メソッドの後ろに「str.downcase!」といったように「!」をつけたり、「include?」といったように「?」をつけた記述を見かけることがあります。
また、defで定義する関数名の後ろに「!」を付ける場合もあります。
ここでは、メソッドや関数名の末尾につける「!」や「?」の意味は何か?どのような処理をしているのかについて実例を交えて解説しています。
メソッド名末尾の!(ビックリマーク)の意味
「!」とは何か?
メソッド名の末尾についている「!」は破壊的な処理を意味しています。
破壊的な処理とは、元となる変数(レシーバー)の値を変更することです。
実例
例えば、文字列を非破壊で小文字に変えるdowncase
メソッドがあります。これは通常の使用では非破壊のため、元の変数の値は変化しません。
str1 = "HELLO WORLD"
str1.downcase
puts str1
# HELLO WORLD
変数「str1」に対してdowncaseメソッドを実行していますが、「str1」自体は元のままで小文字になっていません。
これに対して、downcaseメソッドの末尾に「!」を付けた場合は以下のようになります。
str2 = "HELLO WORLD"
str2.downcase!
puts str2
# hello world
もとの変数「str2」の中身が全て小文字になり、downcase!により、元の変数自体が変わったことがわかります。
関数名の後ろにある「!」の意味
関数名の後ろの「!」の意味
defで関数を定義したときに「def letterCange!(str)」のように関数名の末尾に「!」をつけることがあります。
これは、関数の処理の中で破壊的メソッドを行っていることをわかりやすくするためのものです。
このため、関数名に「!」があろうが、なかろうが実行される処理自体は変わりません。
実例
関数の中で「downcase!」というように破壊的な処理を使う場合は、関数名を「letterCange!」として破壊的な処理であることが一目でわかるようにします。
def letterCange!(str)
str.downcase!
puts str
end
#関数の実行
letterCange!("HELLO WORLD")
#結果
hello world
メソッド名末尾の?(クエスチョンマーク)の意味
「?」の意味
「include?」といったように、メソッド名末尾の「?」(クエスチョンマーク)は、真偽値を返すメソッドに使われるものです。
実例
「include?(引数)」は引数で指定した値が含まれているかどうかを調べ、含まれていれば「true」を含まれていなければ「false」を返すメソッドです。
str1 = "A STRING"
puts str1.include?("RING")
# true
実例:「?」が無いとエラーになる
「include?」は「?」も含めて1つのメソッドのため、「?」がないとエラーになります。
str2 = "A STRING"
puts str2.include("RING")
# NoMethodError (undefined method `include' for "A STRING":String)
# Did you mean? include?
「NoMethodError」と表示され、そんなメソッドは存在しないといわれます。丁寧にその下で「include?」の間違いではと示唆してくれています。
「?」のつく主なメソッド一覧
末尾に「?」がつくメソッドには「include?」以外にも以下のようなものがあります。
メソッド | 意味 | 例 |
---|---|---|
include? | 含むかどうか | “string”.include?(“ring”) => true |
empty? | 空かどうか(Array, Hash, Set) | [].empty? => true |
nil? | nilかどうか | 0.nil? => false |