106

Ruby のメソッドに "?" が含まれているのを時々見かけます。と "!" それらの最後に、例えば:

name = "sample_string"
name.reverse
name.reverse!
name.is_binary_data?

彼らの目的は何だろう?それらは単なる構文シュガーコーティングですか?

4

5 に答える 5

167

読みやすくするために「単なるシュガーコーティング」ですが、共通の意味があります。

  • で終わるメソッドは!、永続的または潜在的に危険な変更を実行します。例えば:
    • Enumerable#sortその場でソートしながら、オブジェクトのソートされたバージョンを返しますEnumerable#sort!
    • Rails では、ActiveRecord::Base#save保存に失敗した場合は false を返しActiveRecord::Base#save!、例外を発生させます。
    • Kernel::exitスクリプトを終了さKernel::exit!せますが、終了ハンドラをバイパスしてすぐに終了します。
  • で終わるメソッド?は boolean を返します。これにより、コードの流れが文のようにさらに直感的になります — if number.zero?「数値がゼロの場合」のように読みますが、if number.zero奇妙に見えます。

あなたの例では、逆の文字列に評価されますが、変数に実際に逆の名前が含まれているのは行のname.reverse後でのみです。「バイナリデータですか?」のように見えます。name.reverse!namename.is_binary_data?name

于 2011-08-24T16:34:05.920 に答える
19

疑問符は、メソッドがブール値を返すことを示します。すでにここで答えています:

Rubyで疑問符演算子はどういう意味ですか?

感嘆符は、メソッドがオブジェクト自体に作用することを示します。すでにここで答えています:

Rubyのメソッドでエクスクラメーションマークが使われるのはなぜですか?

于 2011-08-24T16:33:34.297 に答える
10

Ruby では?、メソッドがブール値を返し、!呼び出されたオブジェクトを変更することを意味します。コードを見るときの可読性を向上させるためにあります。

于 2011-08-24T16:34:13.753 に答える
6

大多数のプログラミング言語とは対照的に...

Ruby では、メソッドは疑問符または感嘆符で終わることができます。

慣例により、質問に答えるメソッド (つまり、レシーバーが空の場合に Array#empty? が true を返す) は疑問符で終わります。

潜在的に「危険な」メソッド (つまり、self または引数を変更するメソッド、exit! など) は、慣例により感嘆符で終わります。

From: http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/、セクション面白いメソッド名

于 2011-08-24T16:35:12.487 に答える
1

これは常に当てはまるわけではないことに注意してください。例として、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」の列を探してスローしようとします。

代わりに、連結を行う前にクローンを作成する必要があります。幸いなことに、私のテストスイートはこれをキャッチしましたが..注意してください!

于 2016-08-26T14:02:37.197 に答える