Ceylon には、すべて何らかの種類の配列と見なされる可能性のあるものについて、いくつかの異なる概念があります: List
、Tuple
、Sequence
、Sequential
、Iterable
、Array
、Collection
などCategory
。
2 に答える
これらのことについて基本的なレベルで学び始めるのに最適な場所は、セイロン ツアーです。そして、これらのことについて詳しく学ぶ場所はモジュール APIです。これらのソース ファイルを参照することも役立ちます。
現代のすべての優れたプログラミング言語と同様に、最初のいくつかのインターフェースは非常に抽象的です。それらは 1 つの正式なメンバーを中心に構築され、一連の既定のメンバーと実際のメンバーを通じて機能を提供します。(Java 8 より前に作成されたプログラミング言語では、正式なメンバーのみを持ち機能を持たない従来のインターフェースと区別するために、これらを「特性」と呼んでいるのを聞いたことがあるかもしれません。)
カテゴリー
インターフェイスについて話すことから始めましょうCategory
。これは、「このコレクションにこのオブジェクトが含まれていますか」と尋ねることができるタイプを表しますが、必ずしもコレクションからメンバーを取得できるとは限りません。正式なメンバーは次のとおりです。
shared formal Boolean contains(Element element)
例として、大きな数のすべての因数のセットがあります。任意の整数が因数であるかどうかを効率的にテストできますが、すべての因数を効率的に取得することはできません。
反復可能
のサブタイプCategory
はインターフェイスIterable
です。各要素を一度に 1 つずつ取得できる型を表しますが、必ずしも要素にインデックスを付ける必要はありません。要素の順序が明確に定義されていない場合があります。要素はまだ存在していないかもしれませんが、その場で生成されます。コレクションは無限に長くなるかもしれません! 正式なメンバーは次のとおりです。
shared formal Iterator<Element> iterator()
例として、標準出力のような文字のストリームがあります。もう 1 つの例は、for ループに提供される整数の範囲です。この場合、数値を 1 つずつ生成する方がメモリ効率が高くなります。
これは Ceylon の特別な型であり、反復可能オブジェクトが空である可能性があるか、確実に空ではないかによって、それぞれ省略されるか、{Element*}
または依存する可能性があります。{Element+}
コレクション
Iterable
のサブタイプの1 つはインターフェイスCollection
です。正式メンバーが 1 つあります。
shared formal Collection<Element> clone()
しかし、それは本当に問題ではありません。a を定義する重要な点はCollection
、ドキュメントの次の行です。
すべて
Collection
の は、値の等価性の明確に定義された概念をサポートする必要がありますが、等価性の定義はコレクションの種類によって異なります。
基本的に、 aCollection
は、構造が明確に定義されているコレクションであり、相互に同等であり、複製可能です。明確に定義された構造に対するこの要件は、これが超抽象的なインターフェイスの最後であり、残りはより馴染みのあるコレクションのように見えることを意味します。
リスト
Collection
のサブタイプの1 つはインターフェイスList
です。これは、インデックス ( ) で要素を取得できるコレクションを表しますmyList[42]
。関数が配列を取得する必要があるが、それが変更可能か不変かを気にしない場合は、この型を使用します。いくつかの正式なメソッドがありますが、重要なものは他のスーパータイプから来ていますCorrespondence
:
shared formal Item? get(Integer key)
シーケンシャル、シーケンス、空
List
のサブタイプで最も重要なのはインターフェイスSequential
です。不変の を表しList
ます。Ceylon はこの型を気に入っており、その周りに多くの構文を構築しています。[Element*]
およびとして知られていElement[]
ます。正確に 2 つのサブタイプがあります。
Empty
(aka[]
)、空のコレクションを表しますSequence
(aka[Element+]
)、空でないコレクションを表します。
コレクションは不変なので、可変コレクションではできないことがたくさんあります。1 つには、 andnull
のような空のリストで多数の操作が失敗する可能性がありますが、最初に型が.reduce
first
Sequence
タプル
の非常に特殊なサブタイプSequence
はTuple
、ここにリストされている最初の真のクラスです。Sequence
すべての要素が 1 つのタイプElement
に制約されるとは異なり、 にTuple
は各要素のタイプがあります。これは Ceylon で特別な構文を取得します。ここ[String, Integer, String]
で、 は正確に 3 つの要素の不変リストであり、正確にそれらの型が正確にその順序で含まれています。
配列
の別のサブタイプList
はArray
、これも真のクラスです。これはおなじみの Java 配列で、変更可能な固定サイズの要素リストです。
drhagen はすでにあなたの質問の最初の部分に非常によく答えているので、2 番目の部分について少しだけお話しします。どのタイプをいつ使用しますか?
一般に:関数を作成するときは、必要な操作をサポートする最も一般的な型を受け入れるようにします。これまでのところ、明らかです。
Category
非常に抽象的で、めったに役に立ちません。
Iterable
繰り返し処理する要素のストリームが予想される場合 (または、 などfilter
のストリーム操作を使用する場合map
) に使用する必要があります。
考慮すべきもう1つのことIterable
は、名前付き引数に追加の構文シュガーがあることです。
void printAll({Anything*} things, String prefix = "") {
for (thing in things) {
print(prefix + (thing?.string else "<null>"));
}
}
printAll { "a", "b", "c" };
printAll { prefix = "X"; "a", "b", "c" };
タイプの任意のパラメーターはIterable
、名前付き引数リストの末尾にコンマ区切りの引数のリストとして指定できます。あれは、
printAll { "a", "b", "c" };
と同等です
printAll { things = { "a", "b", "c" }; };
これにより、DSL スタイルの式を作成できます。ツアーにはいくつかの良い例があります。
Collection
のようCorrespondence
に、かなり抽象的で、私の経験では直接使用されることはめったにありません。
List
よく使うタイプのようですが、実はあまり使った記憶がありません。理由はわかりません。Iterable
私はそれをスキップして、パラメータをorとして宣言しているようですSequential
。
Sequential
不変のSequence
固定長リストが必要な場合です。また、いくつかのシンタックス シュガーがあります: のような可変個引数メソッドは、またはパラメーターvoid foo(String* bar)
のショートカットです。また、演算子を使用することもできます。これは、 and と組み合わせてうまく機能することがよくあります。Sequential
Sequence
Sequential
nonempty
first
rest
String commaSeparated(String[] strings) {
if (nonempty strings) {
value sb = StringBuilder();
sb.append(strings.first); // known to exist
for (string in strings.rest) { // skip the first one
sb.append(", ").append(string);
// we don’t need a separate boolean to track if we need the comma or not :)
}
return sb.string;
} else {
return "";
}
}
私は通常、ストリームを数回反復するときにSequential
andを使用します (ジェネリックではコストがかかる可能性があります) 。Sequence
Iterable
List
Tuple
as は絶対に使用しないでくださいTuple
(それらを抽象化するまれなケースを除きます) が、[X, Y, Z]
構文シュガーを使用すると便利なことがよくあります。Sequential
多くの場合、メンバーをTuple
サブクラスの に絞り込むことができます。g. スーパークラスには が<String|Integer>[] elements
あり、1 つのサブクラスでは であることが知られています[String, Integer] elements
。
Array
インスタンス化して使用するクラスとしてはめったに使用せず、パラメーターの型として使用したことはありません。