【Rails・Ruby】メソッド名や関数名の末尾の!(ビックリマーク)と?(はてなマーク)の意味は何かを実例で解説

rails-prograshi(プロぐらし)-kv Rails
記事内に広告が含まれていることがあります。

RailsやRubyを使っていると、メソッドの後ろに「str.downcase!」といったように「!」をつけたり、「include?」といったように「?」をつけた記述を見かけることがあります。

また、defで定義する関数名の後ろに「!」を付ける場合もあります。

ここでは、メソッドや関数名の末尾につける「!」や「?」の意味は何か?どのような処理をしているのかについて実例を交えて解説しています。


メソッド名末尾の!(ビックリマーク)の意味

「!」とは何か?

メソッド名の末尾についている「!」は破壊的な処理を意味しています。

破壊的な処理とは、元となる変数(レシーバー)の値を変更することです。

注意点

if文の条件式の中で使われる「!」とは全くの別物です。例 if( str != “aaa” )


実例

例えば、文字列を非破壊で小文字に変える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?」といったように、メソッド名末尾の「?」(クエスチョンマーク)は、真偽値を返すメソッドに使われるものです。

point

メソッド末尾の「?」も含めて1つのメソッドです。このため、「?」がないとエラーになります。


実例

「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


参考リンク

Ruby公式 使われる記号の意味

タイトルとURLをコピーしました