「破壊的メソッド」はRuby用語なのか？

昨日、「[データサイエンティストが知るべき破壊的メソッドのすべて](https://qiita.com/ninomiyt/items/2e3fb2569427312f28cc)」という記事を書いたのですが、友人から次のような意見を貰いました。

> 微妙に気になったけど、「破壊的メソッド」「非破壊的メソッド」ってプログラミング全般でなくRuby用語で、かつ、「レシーバを変更するメソッド」っていう意味じゃない？
> もしあえて名前で呼ぶなら、inplace methodが正しそう。(日本語は見つからない)
> https://discuss.pytorch.org/t/what-is-in-place-operation/16244
> https://ja.wikipedia.org/wiki/In-placeアルゴリズム

更に、例えばpandasでも[inplaceという引数名が使われている](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.rename.html)ので、データサイエンティスト向けならinplaceのほうが馴染みあるかもしれないとも言われました。

たしかに「破壊的」と調べて出てくる記事は、Rubyのものが多いように思います。少し気になったので、いろいろな言語のドキュメントで「破壊的(destructive)」「インプレース(in-place)」という単語で調べて比較してみました。


# Pythonの場合: in-placeが優勢

[ドキュメントを検索した](https://docs.python.org/ja/3.8/search.html?q=%E3%82%A4%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%82%B9&check_keywords=yes&area=default)ところ、実際に「インプレース(in-place)」という単語がよく使われているようです。例えば「[プログラミング FAQ](https://docs.python.org/ja/3.8/faq/programming.html?highlight=%E3%82%A4%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%82%B9#how-do-i-modify-a-string-in-place)」の中では次のようにあります。

> 文字列をインプレースに変更するにはどうしたらいいですか？¶
>
> 文字列はイミュータブルなので、それはできません。殆どの場合、組み立てたい個別の部品から単純に新しい文字列を構成するべきです。

一方で、「破壊的(destructive)」という単語も多少は使われています。例えば[Python2.7](https://docs.python.org/ja/2.7/library/stdtypes.html)のドキュメントには「破壊的に(destructively)」という単語があります。最新バージョンのドキュメントでは「消去して返します」とありますが、日本語の訳語が変わっただけでした。

> 集合のアルゴリズムで使われるのと同じように、 `popitem()` は辞書を破壊的にイテレートするのに便利です。辞書が空であれば、 `popitem()` の呼び出しは `KeyError` を送出します。

Python3.8でも「[curses --- 文字セル表示を扱うための端末操作](https://docs.python.org/ja/3.8/library/curses.html)」の中に「非破壊的(non-destructive)」という単語が見つかりました。

> ウィンドウを `destwin` の上に重ね書き (overlay) します。ウィンドウは同じサイズである必要はなく、重なっている領域だけが複写されます。この複写は非破壊的です。

少し離れた箇所に「破壊的(destructive)」もあります。

> `destwin` の上にウィンドウの内容を上書き (overwrite) します。ウィンドウは同じサイズである必要はなく、重なっている領域だけが複写されます。この複写は破壊的です。


# Rubyの場合: destructive methodという用語が説明されている

[Official Ruby FAQ](https://www.ruby-lang.org/en/documentation/faq/7/)の中に「What is a destructive method?」という項目が用意されていました。日本語版の訳は見つかりませんでした。

> The plain version creates a copy of the receiver, makes its change to it, and returns the copy. The “bang” version (with the !) modifies the receiver in place.

説明の中に「in place」という単語も使われています。

ドキュメントではあまりヒットしなかったので、るびまも見てみます。やはり「破壊的」という単語がよく使われています。例えば「[Ruby コードの感想戦 【第 2 回】 WikiR](https://magazine.rubyist.net/articles/0041/0041-CodePostMortem.html)」より。

> force_encoding は ! がついていないので名前だけではわかりづらいですが、破壊的なメソッドです。 そのため、戻り値を text に代入する必要はありません。これで十分です。

「6 月 10 日 午前の部」でin-placeという単語が使われている箇所もありました。

> 文法上、yield が先に入って、ブロックつき引数を後で導入したとき yield が邪魔になった。あと String で、in-place で mutate するしないがごっちゃになってよくない。Perl からもってきた組み込み変数の 98% は後悔してます。


# PHPの場合: 両方とも併用されている

「in-place」と「destructive」という単語が両方とも使われているようです。これらの箇所の日本語への翻訳はまだ行われていない様子？

「[Ds\Sequence::sort](https://www.php.net/manual/ja/ds-sequence.sort.php)」より

> Sorts the sequence in-place, using an optional comparator function. 

[Ds\PriorityQueue::toArray](https://www.php.net/manual/ja/ds-priorityqueue.toarray.php)より。

> 注意:
>
> This method is not destructive.


# その他の言語

Rubyに影響を与えたSmalltalkも調べてみたかったのですが、はっきりしたこととは分かりませんでした。ただ、[Smalltalk-72](http://bitsavers.informatik.uni-stuttgart.de/pdf/xerox/parc/techReports/Smalltalk-72_Instruction_Manual_Mar76.pdf)のドキュメントを見ると、non-destructiveという単語が少なくとも一箇所使われていました。

> Note that you can make non-destructive text by using xor ink which complements the background so that reshowing the text crases it while restoring what was
underneath. 

また、基本的に変数がイミュータブルなHaskellも調べてみたのですが、destructiveが「過去の互換性を切った言語仕様のアップデート」という意味で使われているものしか見つけられなかったのと、ドキュメント自体を読むのが今の私にとっては骨が折れそうだったので諦めました。


また、Rubyでは「destructive method」という固有名詞に近い使われ方をしているのに対して、他の言語のdestructiveは一般的な形容詞として使われているように見えます。もしかすると、「破壊的メソッド」というのはRubyのコミュニティで使われ始めた言葉が、日本語でプログラミング用語として認識されて広まったものなのかもしれません。機会があればまた調べてみます。