为什么`infix`是默认值

时间:2015-05-31 09:41:37

标签: swift infix-notation

我正在快速阅读advanced operators

基本功能:

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如何被认为是默认值。从正常的函数声明来看,它看起来并没有什么不同。

这里的规则是什么 - 任何单个字符是中缀操作的合法名称?这是否意味着单个字符函数不被允许?可以在swift中将任何双参数函数称为中缀样式吗?

3 个答案:

答案 0 :(得分:6)

  

我不明白中缀如何被认为是默认值。

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

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

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

  

这是否意味着不允许单个字符功能? swift中的任何双参数函数都可以称为中缀样式吗?

没有。以任何这些字符开头的函数是运算符:/,=, - ,+,!,*,%,<,>,&,|,^,?或〜 1 。运算符也可以包含多个字符,但必须以其中一个字符开头。

请记住,必须首先声明一个新运算符,例如:

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

/56

然而,这个声明不起作用,因为a不是运营商必须开始的字符之一:

prefix operator a {}

1 实际上有更多的角色。阅读here

答案 1 :(得分:1)

不,并非所有单个字符都可以作为中缀运算符。一般来说,规则是标识符(变量,方法名称等)中允许的字符和运算符中允许的字符不一样。

例如,运算符中允许的字符指定为here

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

答案 2 :(得分:0)

如果我的问题得到了解答,我认为答案是:您正在超载现有运营商。

假设我们要使用自定义运算符,我需要声明前缀/ infix / postfix

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

像:

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