質問: [4, 1, 2, 6] sorted(a) # 戻り値として[1, 2, 4, 6]、aは非破壊 ``` `a.sorted()` のほうがわかりやすい(混乱しにくい)気がするのですが、どういういきさつなのでしょうか? 英語の文法的、英語の語感的問題? ※ もちろん `sort(a)` の実装というのもアリかもしれない、いずれにしても関数とメソッドがごっちゃになってるのが気持ち悪いということ
回答: すでに解決にされたようなので今更な回答ですが回答してみます。 歴史的な経緯についてはわからないのですが、おそらく以下のような理由でこの作りになったのではないかと思います。 * 前提として、 Ruby はオブジェクト指向言語としての一貫性を重視していて、 Python はオブジェクト指向言語と関数型言語のよいとこ取りをしている。 * Ruby は複数のクラスにまたがって使用できる機能を通常ミックスインで実装するが、 Python はそのような機能をミックスインで実装することもあれば関数で実装することもある。 * 「関数で実装することもある」の代表例は iterable を受け取る組み込みの関数群。今回あげられた `sorted()` の他にも `all()` `any()` `enumerate()` `filter()` `map()` `min()` `max()` `reversed()` `sum()` `zip()` 等がある。 * iterable を受け取るこれらの関数には副作用が無い点が共通している(関数型言語的)。 ということで、 `sorted()` は `list` の他にもさまざまな iterable に対して使えて副作用の無い汎用的な機能だから関数で用意しよう。 `sort()` は副作用があり広く iterable に使える機能ではないので、 `list` のメソッドで用意しよう。となったのではないかと思います。 個人的な感覚では、 Python の `sorted()` はどちらかというと `sort.list()` よりも `all()` や `reversed()` に近いイメージで捉えています( Ruby の破壊的メソッドと非破壊的メソッドが `!` のあるなしでペアになっているのもそれはそれで直感的でわかりやすいと思います)。 ご参考になればと思います。