web-dev-qa-db-ja.com

「!」の目的は何ですかそして「?」メソッド名の最後に?

時々、Rubyに、末尾に「?」と「!」があるメソッドがあります。例:

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

私は彼らの目的が何であるかと思っていましたか?それらは単なる構文糖衣ですか?

94
itsaboutcode

読みやすくするために「ただの砂糖塗り」ですが、共通の意味があります。

  • _!_で終わるメソッドは、永続的または潜在的に危険な変更を実行します;例えば:
    • _Enumerable#sort_はオブジェクトのソートされたバージョンを返し、_Enumerable#sort!_はオブジェクトを所定の位置にソートします。
    • Railsでは、保存に失敗すると_ActiveRecord::Base#save_はfalseを返し、_ActiveRecord::Base#save!_は例外を発生させます。
    • _Kernel::exit_はスクリプトを終了させますが、_Kernel::exit!_はすぐに終了し、終了ハンドラーをバイパスします。
  • _?_で終わるメソッドはブール値を返します。これにより、コードはより直感的に文のようになります— _if number.zero?_は「if the number is zero」ですが、_if number.zero_奇妙に見える。

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

151
jtbandes

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

Rubyで疑問符演算子は何を意味しますか?

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

なぜ感嘆符はRubyメソッド?

13
Bill

In Ruby the ?は、メソッドがブール値を返し、!は、呼び出されたオブジェクトを変更します。これらは、コードを見たときに読みやすくするためにあります。

7
J Lundberg

これとは対照的に、ほとんどのプログラミング言語は...

ルビー、メソッドは疑問符または感嘆符で終了できます。

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

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

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

5
miku

注意してください、これは常にそうではありません。たとえば、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」の列を検索してスローしようとします。

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

0
wintondeshong