Swift如何消除泛型构造函数的歧义?
发布时间:2020-12-14 04:26:51 所属栏目:百科 来源:网络整理
导读:考虑以下 Swift表达式 println(GenericFoo,Bar(1)) 通常,人们会将其视为对构造函数Generic Foo,Bar的通用调用.用参数(1). println( GenericFoo,Bar(1) ) 但是,当重新排列令牌时,它也可能代表两个单独的比较,例如,如果Generic和Foo是一些命名不佳的数字变量:
考虑以下
Swift表达式
println(Generic<Foo,Bar>(1)) 通常,人们会将其视为对构造函数Generic< Foo,Bar>的通用调用.用参数(1). println( Generic<Foo,Bar>(1) ) 但是,当重新排列令牌时,它也可能代表两个单独的比较,例如,如果Generic和Foo是一些命名不佳的数字变量: println(Generic < Foo,Bar > (1)) // or,with proper parenthesis println((Generic < Foo),(Bar > 1)) 我们在这里可以观察到的是,具有这样的通用构造函数的表达式是非常模糊的,并且即使对于人类也不容易消除歧义.这里的问题是Swift没有构造函数的新关键字,这使得它们在某些情况下与方法调用和运算符不一致.因此,我感兴趣的是Swift编译器(解析器)如何设法消除上述表达式的歧义.它的解析方式取决于上下文(类型,变量,函数)还是可以由解析器解析? 解决方法
答案很简单:编译器根本不允许您声明这些变量:
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)) 在另一个源文件中创建变量或类型声明时,当前声明“覆盖”另一个声明. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |