2015-05-31 21 views
1

我正在阅读关于advanced operators的swift。为什么'infix`是默认的

基本功能:

func add(a: Unicorn, b: Unicorn) -> Unicorn { return a + b } 
add(u1, u2) // two unicorns are added 

中缀运算符:

func + (a: Unicorn, b: Unicorn) -> Unicorn { return a + b } 
c = u1 + u2 

后缀:

postfix func + (a: Unicorn) -> Unicorn { return a + 2 } // nonsense example 
u1+ 

我不明白怎么infix可以推定为默认值。从正常的函数声明来看,它与我看起来没有什么不同。

这里有什么规则 - 任何单个字符是中缀操作的合法名称?这是否意味着单个char函数不被允许?可以任意两个参数函数在swift中被称为infix风格?

+0

有时候,为了真正理解编程语言中的某些东西,你需要去学习一些关于编译器的知识。在这种情况下,词法分析是什么以及语法分析是什么。 – Sulthan

+0

要了解真正全面的知识,学习词法分析器和编译器会很棒。我很乐意参加编译器课程。现在,只要知道如果函数名是一个运算符并且它有两个参数就足够了,'infix'是一个可导出的默认值。自定义操作符需要定义,所以这仍然有效。 – SimplGy

回答

5

我不明白如何中缀可以被认为是默认的。

如果你使用两个参数实现一个运算符,编译器可以确定你想要一个中缀运算符,因为只有中缀运算符对两个值进行操作。

如果您使用一个值实现运算符,编译器不确定它是前缀还是后缀运算符,并且会发出抱怨。

中缀运算符有两个值,后缀和前缀只有一个。

这是否意味着单个字符函数不被允许? swift中的任何两个参数的函数都可以称为infix风格吗?

号,与任何这些字符中的开头的功能是一个操作符:/,=, - ,+, - ,*,%,<,>,&,|,^,或〜!? 1。操作员也可以由多个字符组成,但必须以其中一个字符开头。

请记住,新的运营商必须首先声明,对于这样的实例:

prefix operator/{} 
prefix func/(a: Int) -> Int { 
    return a/42 
} 

/56 

但是这个声明将无法工作,因为a不是与运营商必须启动的人物之一:

prefix operator a {} 

实际上有更多的字符。阅读here

+0

很棒的回答。我错过了一个事实,即操作符是一个预定义的[list of things](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/LexicalStructure.html#//apple_ref/doc/uid/TP40014097) -CH30-ID410),如果你想要新的,你必须[单独声明](https://medium.com/swift-programming/facets-of-swift-part-5-custom-operators-1080bc78ccc) 。现在一切都很有意义。谢谢。 – SimplGy

0

如果我得到你的问题,我想答案是:你超载现有的运营商。

比方说,我们可以使用自定义操作,我需要声明的前缀/中缀/后缀

编辑: 在互联网上找到一个更好的例子:

像:

infix operator **= { associativity right precedence 90 } 
func **= (inout left: Double, right: Double) { 
    left = left ** right 
} 
1

不,不是所有单个字符都可以是中缀操作符。通常,规则是标识符(变量,方法名称等)中允许的字符和运算符中允许的字符不相同。

例如,允许运营商中的字符指定here

更具体地,在令牌的第一个字符是决定性的。