Ruby の map と collect の違いは何ですか? 質問する

Ruby の map と collect の違いは何ですか? 質問する

これについて Google で検索したところ、不完全な矛盾した意見が見つかりました。Ruby /Rails の配列でを実行することmapと を実行することの間に実際に違いはあるのでしょうか?collect

ドキュメント何も示唆されていないようですが、方法やパフォーマンスに違いがあるのでしょうか?

ベストアンサー1

違いはありません。実際、は C ではおよびmapとして実装されています(たとえば、配列の と他の列挙型の の間には違いがありますが、と の間には違いはありません)。rb_ary_collectenum_collectmapmapcollect


Ruby にはなぜ と の両方mapcollect存在するのでしょうか?このmap関数には、さまざまな言語で多くの命名規則があります。Wikipediaでは概要が紹介されている:

map 関数は関数型プログラミング言語で生まれましたが、今日では多くの手続き型言語、オブジェクト指向言語、マルチパラダイム言語でもサポートされています (または定義できます)。C++ の標準テンプレート ライブラリでは と呼ばれtransform、C# (3.0) の LINQ ライブラリでは と呼ばれる拡張メソッドとして提供されていますSelect。map は、Perl、Python、Ruby などの高級言語でもよく使用される操作です。この操作は、mapこれら 3 つの言語すべてで呼び出されます。mapの別名collectは、Ruby (Smalltalk 由来) でも提供されていますmapcar[強調は筆者による]。Common Lisp は、map のような関数のファミリを提供しています。ここで説明する動作に対応するものは、 (CAR 操作を使用してアクセスすることを示す -car)と呼ばれます。

Ruby は、Smalltalk の世界のプログラマーにとって、より親しみやすいエイリアスを提供します。


なぜ配列と列挙型で実装が異なるのでしょうか?列挙型は一般化された反復構造であり、Rubyが次の要素が何であるかを予測する方法がないことを意味します(無限の列挙型を定義することはできます。プライムたとえば、次のようになります。したがって、連続する各要素を取得するには関数を呼び出す必要があります (通常はこれが メソッドになりますeach)。

配列は最も一般的なコレクションなので、そのパフォーマンスを最適化するのは理にかなっています。Rubyは配列の動作についてよく知っているので、呼び出す必要はなくeach、単純なものだけを使用できます。ポインタ操作大幅に高速化されます。

zipまたはのような多くの配列メソッドにも同様の最適化が存在しますcount

おすすめ記事