破壊的メソッド、副作用のあるメソッド
研修の中で「破壊的メソッド」とはなにか、という話があったのだが、適当に答えてしまった気がするのでもう少し調べよう。
「破壊的」とは
Rubyのリファレンスにはこう書かれている。
https://docs.ruby-lang.org/ja/latest/doc/glossary.html#ha
レシーバーに影響を与えるメソッドは「破壊的」であると呼ばれる。
例えば文字列オブジェクトについて、そのオブジェクト自身の文字の並びを変更することは破壊的といえる。
配列オブジェクトの場合、ある要素を別のオブジェクトに取り換える操作は破壊的であるが、要素に破壊的操作を行うことは配列に対する破壊的操作に該当しない。したがって、配列オブジェクトを凍結しただけではその配列から算出される結果を固定することはできない。
また、bang methodについては
def xxx!
「!」はメソッド名の一部です。慣用的に、 同名の(! の無い)メソッドに比べてより破壊的な作用をもつメソッド(例: tr と tr!)で使われます。
という記載がある。より破壊的な作用を持つ、という相対的な記載となっている。あくまでも相対的。そして破壊的メソッドにつける、とは書いていない。
https://magazine.rubyist.net/articles/0032/0032-CallByValueAndCallByReference.html
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/~poffice/mail/ruby-list/7484
しばらくRubyしか触ってなかったから参照渡しという概念をすっかり忘れてた。Rubyは参照の値渡しをしているのね。
変数を示すアドレスにはそのオブジェクトのアドレスが値として入っている。だから、Rubyの入門書にはよく、変数とはオブジェクトに付けるラベルのことだ、という説明がある。変数名を箱につけてそのなかに何かをいれるイメージではない。
Array#delete は破壊的やんけ! というツッコミに対する回答
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/25288
「破壊的メソッド」はRuby用語なのか?
https://qiita.com/ninomiyt/items/c63451ef2340ed8ac0cd
「破壊的メソッド(destructive method)」という用語はMatzが発祥っぽい
https://qiita.com/ninomiyt/items/ec15ba39ccd48ba4afa5
「破壊的メソッド」という起源をMatzが否定しているツイート
Lispから拾ったっぽい。
https://twitter.com/yukihiro_matz/status/1256944215495340035
「破壊的」の定義と副作用のちがいについて
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/13899
同じことを書いてる人がいらっしゃった。
https://qiita.com/tadsan/items/7baab2605a4d8ac1858e