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のような空のリストで多数の操作が失敗する可能性がありますが、最初に型が.reducefirstSequence
タプル
の非常に特殊なサブタイプ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 と組み合わせてうまく機能することがよくあります。SequentialSequenceSequentialnonemptyfirstrest
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 "";
}
}
私は通常、ストリームを数回反復するときにSequentialandを使用します (ジェネリックではコストがかかる可能性があります) 。SequenceIterableList
Tupleas は絶対に使用しないでくださいTuple(それらを抽象化するまれなケースを除きます) が、[X, Y, Z]構文シュガーを使用すると便利なことがよくあります。Sequential多くの場合、メンバーをTupleサブクラスの に絞り込むことができます。g. スーパークラスには が<String|Integer>[] elementsあり、1 つのサブクラスでは であることが知られています[String, Integer] elements。
Arrayインスタンス化して使用するクラスとしてはめったに使用せず、パラメーターの型として使用したことはありません。