5

次の Swift 式を検討してください

println(Generic<Foo, Bar>(1))

Generic<Foo, Bar>通常、これは、引数を持つコンストラクターへの一般的な呼び出しとして読み取られます(1)

println( Generic<Foo,Bar>(1) )

ただし、トークンを少し並べ替えると、2 つの個別の比較を表すこともできます。たとえば、GenericFooが不適切な名前の数値変数である場合です。

println(Generic < Foo, Bar > (1))
// or, with proper parenthesis
println((Generic < Foo), (Bar > 1))

ここで観察できることは、このようなジェネリック コンストラクターを使用した式は非常に曖昧であり、人間にとっても曖昧さを解消するのは容易ではないということです。ここでの問題は、Swift にはコンストラクターのキーワードがないnewため、場合によってはメソッド呼び出しと演算子があいまいになることです。したがって、Swift コンパイラ (パーサー) が上記の式をどのように曖昧さをなくすかに興味があります。構文解析の方法はコンテキスト (型、変数、関数) に依存しますか、それともパーサーによって解決できますか?

4

2 に答える 2

1

答えは簡単です: コンパイラは単にこれらの変数を宣言することを許可していません:

struct Generic<T, U> {

    init(_ i: Int) {}
}
struct Foo {}
struct Bar {}

print(Generic<Foo, Bar>(1))

// error
let Foo = 0      // invalid redeclaration of Foo
let Bar = 3      // invalid redeclaration of Bar
let Generic = 5  // invalid redeclaration of Generic
print(Generic<Foo, Bar>(1))

別のソース ファイル内の変数または型宣言のいずれかを作成すると、現在の宣言が他方を「オーバーライド」します。

于 2015-07-27T13:34:04.427 に答える