Ruby のメソッドに "?" が含まれているのを時々見かけます。と "!" それらの最後に、例えば:
name = "sample_string"
name.reverse
name.reverse!
name.is_binary_data?
彼らの目的は何だろう?それらは単なる構文シュガーコーティングですか?
Ruby のメソッドに "?" が含まれているのを時々見かけます。と "!" それらの最後に、例えば:
name = "sample_string"
name.reverse
name.reverse!
name.is_binary_data?
彼らの目的は何だろう?それらは単なる構文シュガーコーティングですか?
読みやすくするために「単なるシュガーコーティング」ですが、共通の意味があります。
!
、永続的または潜在的に危険な変更を実行します。例えば:
Enumerable#sort
その場でソートしながら、オブジェクトのソートされたバージョンを返しますEnumerable#sort!
。ActiveRecord::Base#save
保存に失敗した場合は false を返しActiveRecord::Base#save!
、例外を発生させます。Kernel::exit
スクリプトを終了さKernel::exit!
せますが、終了ハンドラをバイパスしてすぐに終了します。?
は boolean を返します。これにより、コードの流れが文のようにさらに直感的になります — if number.zero?
「数値がゼロの場合」のように読みますが、if number.zero
奇妙に見えます。あなたの例では、逆の文字列に評価されますが、変数に実際に逆の名前が含まれているのは行のname.reverse
後でのみです。「バイナリデータですか?」のように見えます。name.reverse!
name
name.is_binary_data?
name
疑問符は、メソッドがブール値を返すことを示します。すでにここで答えています:
感嘆符は、メソッドがオブジェクト自体に作用することを示します。すでにここで答えています:
Ruby では?
、メソッドがブール値を返し、!
呼び出されたオブジェクトを変更することを意味します。コードを見るときの可読性を向上させるためにあります。
大多数のプログラミング言語とは対照的に...
Ruby では、メソッドは疑問符または感嘆符で終わることができます。
慣例により、質問に答えるメソッド (つまり、レシーバーが空の場合に Array#empty? が true を返す) は疑問符で終わります。
潜在的に「危険な」メソッド (つまり、self または引数を変更するメソッド、exit! など) は、慣例により感嘆符で終わります。
From: http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/、セクション面白いメソッド名
これは常に当てはまるわけではないことに注意してください。例として、Ruby Array#concat http://docs.ruby-lang.org/en/2.0.0/Array.html#method-i-concatを取り上げます。
やけどのひどいところは みたいなところですMyActiveRecordModel.column_names.concat([url])
。MyActiveRecordModel に関連するその後の呼び出しは、MyActiveRecordModel の「url」の列を探してスローしようとします。
代わりに、連結を行う前にクローンを作成する必要があります。幸いなことに、私のテストスイートはこれをキャッチしましたが..注意してください!