メソッド名の後にある「!」びっくりマーク・エクスクラメーションマークとは
Rubyで使われる記号の意味より
ですって。「!」ビックリを加えることで、メソッドの動作が直接変わる、という訳ではないのですね。
見た目でわかりやすいから、便宜的に「!」ビックリを加えているようです。
ちなみにメソッド名の後にある「?」はてなマーク・クエスチョンマークとはもどうぞ。
ちょっと上の例に出ている tr と tr! の違いを調べてみました。
どれくらい tr! が「破壊的」なのか楽しみです。
tr も tr! も文字列置換なのですが、tr は自分自身を書き換えることは絶対にしません。
tr! は、置換対象の文字の中に、検索している文字が見つかったら、自分自身もちゃっかり書き換えちゃうようです。
tr! で、検索している文字がもし見つからなかったら、だだをこねて nil を返すけど、ただし自分自身は書き換えないようです。どんだけー。
自分も書き換えちゃうというところが「破壊的」だったようですね。
ちなみに、ほかの例ですと、exit には、「破壊的な」exit! というメソッドも用意されているようですが、exit! はどんだけ「破壊的」かというと、マニュアルによりますと、
exit は、例外SystemExitが発生するので rescue で exit 実行後の処理を続けることができる
exit! は、もうとにかくそこの行で処理を終了する
という特徴があるそうです。
【広告】
「!」はメソッド名の一部です。慣用的に、同名の(! の無い)メソッドに比べてより破壊的な作用をもつメソッド(例: tr と tr!)で使われます。
ですって。「!」ビックリを加えることで、メソッドの動作が直接変わる、という訳ではないのですね。
見た目でわかりやすいから、便宜的に「!」ビックリを加えているようです。
ちなみにメソッド名の後にある「?」はてなマーク・クエスチョンマークとはもどうぞ。
ちょっと上の例に出ている tr と tr! の違いを調べてみました。
どれくらい tr! が「破壊的」なのか楽しみです。
hensu = '1234'
p hensu # => "1234"
p hensu.tr('1-3', 'a-c') # => "abc4"
p hensu # => "1234" ※注:自分自身は書き換えられない
p hensu.tr!('1-3', 'a-c') # => "abc4"
p hensu # => "abc4" ※注:自分自身が書き換えられてしまった
hensu = '4444'
p hensu # => "4444"
p hensu.tr('1-3', 'a-c') # => "4444"
p hensu # => "4444" ※注:自分自身は書き換えられない
p hensu.tr!('1-3', 'a-c') # => nil
p hensu # => "4444" ※注:自分自身は書き換えられない。nil に書き換えられる訳でもない
tr も tr! も文字列置換なのですが、tr は自分自身を書き換えることは絶対にしません。
tr! は、置換対象の文字の中に、検索している文字が見つかったら、自分自身もちゃっかり書き換えちゃうようです。
tr! で、検索している文字がもし見つからなかったら、だだをこねて nil を返すけど、ただし自分自身は書き換えないようです。どんだけー。
自分も書き換えちゃうというところが「破壊的」だったようですね。
ちなみに、ほかの例ですと、exit には、「破壊的な」exit! というメソッドも用意されているようですが、exit! はどんだけ「破壊的」かというと、マニュアルによりますと、
exit は、例外SystemExitが発生するので rescue で exit 実行後の処理を続けることができる
exit! は、もうとにかくそこの行で処理を終了する
という特徴があるそうです。
【広告】
というご指摘をせっかくしてくださったのに、コメントを間違って消してしまいました。
上記の続きを知らずしてコメントを消してしまったので、大変焦っています。
本当に申し訳ないですが、もう1回ご指摘いただけないでしょうか。
本当にごめんなさい。
自戒の念も含めまして、上記のコメントを基に、このエントリの「破壊的」うんぬんの記述を書き改めてみました。
いかがでしょうか。確かに自分で誤解している部分はありました。ご指摘ありがとうございます。
コメントお待ちしております。