3

次の 2 つの式を見てください。

baz(Foo<Bar, Bar>(0))
baz(Foo < Bar, Bar > (0))

baz、 、FooおよびBarが (baz型またはメソッドであるFoo可能性があり、型または変数である可能性がある)を知らなければ、 が型引数リストを表すのか小なり演算子を表すのBarかを明確にする方法はありません。<

// two different outcomes, difference shown with parentheses
baz((Foo<Bar,Bar>(0)))      // generics
baz((Foo < Bar), (Bar > 0)) // less-than

適切なプログラミング言語は、このような式を解析するときに whatbazに依存するべきではFooありません。Barそれでも、Swift は、空白をどこに置いても、以下の式のあいまいさを解消することができます。

println(Dictionary<String, String>(0))
println(Dictionary < String, String > (0))

コンパイラはこれをどのように管理しますか? そして、さらに重要なことに、Swift 言語仕様には何か場所があります。このためのルールが記述されています。Language ReferenceSwift bookの一部を調べたところ、次のセクションしか見つかりませんでした。

特定の構文では、先頭に<or>が付いた演算子が 2 つ以上のトークンに分割される場合があります。残りは同じ方法で処理され、再度分割される場合があります。>その結果、 のような構造で終了文字間のあいまいさを解消するために空白を使用する必要はありませんDictionary<String, Array<Int>>。この例では、終了>文字は単一のトークンとして扱われず、ビット シフト>>演算子として誤って解釈される可能性があります。

この文脈でとは何certain constructsを指しますか? 実際の文法には、型引数に言及する生成規則が 1 つだけ含まれています。

明示的なメンバ式 → 後置式の.識別子ジェネリック引数句のオプション

説明やリソースをいただければ幸いです。

4

1 に答える 1