web-dev-qa-db-ja.com

リストとタプル-何をいつ使用するか

ElixirListsTuplesの違いを把握しようとしています。 Elixir Guidesの Basic Types セクションから、私はそれを理解しています:

  • リストはリンクされたアイテムとして保存されます
  • リストの更新は高速です(先頭に追加する場合のみ)
  • リストアイテムの取得が遅い
  • リスト情報(サイズ/長さ)の取得が遅い
  • タプル要素は一緒に保存されます
  • タプル情報の取得は高速です
  • タプル要素のフェッチは高速です
  • タプルの変更は高価です

さて、それは大丈夫ですがいつをいつ使用するかわかりません。ほとんどのメソッドはタプルを返しますが、他のすべての場所でリストが使用されており、多くのメソッドはタプルではなくリストを入力として受け入れます。上記のポイントで、ユーザーが指定した値のタプルからの読み取りは高速になるため、データの受け渡しにタプルを使用しないでください。

タプルが列挙可能ではないことにも気付きましたが、どうなっていますか?リストでEnumを使用する方が、リストで使用するよりも速くありませんか?

誰かが私にそれらをよりよく理解するのを助けてくれれば、おそらく何をいつ使うかという例をいくつか与えることで、それは素晴らしいでしょう。

51
Sheharyar

あなたはすでに違いのかなり良い要約を与えたので、それらのうちの1つが重要であるどんな状況でも、それはあなたがどちらを使うべきか決めるのを助けるはずです。

これについて考える方法は、リストは制限のないデータ構造であり、そのサイズは実行時に変化する可能性があるのに対し、タプルにはコンパイル時に一定のサイズが設定されるということです。

たとえば、iexセッション中にユーザーが指定したすべてのコマンドを保存したい場合は、リストが必要になります。リストの長さは、そのセッションで指定されたコマンドの数によって異なります。これをタプルの一般的なユースケースと比較してください-メソッドから{:ok, result}または{:error, reason}を返します-ここでは要素の数が事前にわかっているため、パフォーマンスに許容できない価格を支払う必要はありませんタプルの改善。

列挙について-タプルは概念的にはコレクションではなく、すべての要素の位置もその役割を表すことになっています。 {:ok, #PID<0.336.0>}タプルについて考えてみましょう。これを繰り返すと、最初に:okが得られ、次に#PID<0.336.0>が得られます。これらのものに対して均一に機能する関数を書くのは非常に奇妙です。

37
Paweł Obrok

私は専門家ではありませんが、これは私の理解です:

内部的には、リストはリンクされたリストです。したがって、リンクリストのパフォーマンス特性があります。つまり、長さの取得はO(n)です。これは、リスト全体をウォークする必要があるためです。同様に、リストにはリンクリストの利点もあります。つまり、簡単に拡張できます。フロントに追加することにより。

内部でタプルが何であるかはわかりませんが、リンクされたリストではないことはわかっています。誰かが2013年にElixir言語のメーリングリストでタプルを列挙することについて質問しました。これは応答の一部です:

「タプルは繰り返し処理を行うものではありません。elem/ 2とsize/1を使用できるという事実に混同しないでください。タプルは複数の情報を一緒に保存するためのものであり、意図されていることを意味するものではありません。コレクションを保管してください。」

-ピーター・ミンテン

「もう1つの説明は、タプルは貧乏人の記録であるということです。つまり、タプルは、集計ではありますが、単一のデータ、単一の値を表します。その特定のタプルのセマンティックな意味を変更せずに、タプルから要素を取り除くことはできません。値。

「これは、多くの値に依存しない値を格納するリストや他のコレクションとは対照的です。リストから値を削除すると、単にリストの長さが短くなります。何の意味的な意味にも影響しません。」

-アレクセイショリク

言い換えれば、タプルとリストの間に表面的な類似点があるからといって、動作が同じであると想定すべきではありません。

19

すでに述べたことに加えて、タプルとリストを区別するのに役立ったのは、データベースの行に類似しています。タプルをこのように考えると、タプル内の情報が互いにどのように関連しているかが簡単にわかり、また、それをEnumerableとして使用しない理由が明らかになります。

12
indykid

Javaに慣れている場合:

  • リストはLinkedListのようなものです。
  • タプルはArrayListのようなものです。
1
tbodt

誰かが内部でタプルがどのように似ているのかわからないと述べたので、配列とタプルの両方が隣接するメモリに要素を格納するため、タプルは配列に似ています。したがって、リンクされたリストで配列を使用する場合も、Elixirのリストでタプルを使用する場合と同じルールが適用されます。

0
Amit L.

タプルは固定数の要素を保持することを目的としているため、メモリを事前に割り当てます。基本的にタプルは変更することを意図していません(可能ですが高価です)。関連情報を提供します。

例:地理座標{43.258389、-2.924405}

それどころか、リストは動的コレクションに適しています(変更の方が安価です)。

私はこの投稿が非常に役に立ったと感じました: https://blog.appsignal.com/2018/08/21/elixir-alchemy-list-vs-tuples.html

0
Alex Epelde