问题1:允许中缀运营商没有关联性的目的是什么? (可能有人可以给出一个自定义运算符的示例,其中这比实际包含一些关联性更好?)
问题2:是否可以为中缀运算符设置默认关联性,用于没有运算符的运算符?
我们可以定义自定义中缀运算符而不为其输入任何关联性,例如
/* no associativity */
infix operator +| {
precedence 140
}
/* left associativity */
infix operator *| {
associativity left
precedence 140
}
现在,人们可以假设使用没有关联性的中缀运算符(上面+|
)旁边的一个具有关联性(*|
以上)---其中两个运算符具有相同的优先级---会表现出来就像两个运算符具有相同的关联性一样。但是,情况并非如此
func +| (lhs: Int, rhs: Int) -> Int {
return lhs+rhs
}
func *| (lhs: Int, rhs: Int) -> Int {
return lhs*rhs
}
let a : Int = 1 +| 2 *| 3
/* Error: non-associative operator is adjacent to
operator of same precedence */
如果我们将associativity left
添加到上面+|
的定义中,代码运行正常(按预期方式)
/* no associativity */
infix operator +| {
associativity left
precedence 140
}
// ...
let a : Int = 1 +| 2 *| 3
/* 9, OK ((1+2)*3 = 9) */
如果我查看本机Swift运算符(Cmd-单击import Swift
中的 Swift ),我找不到没有关联性的单个中缀运算符。
为什么我们允许在没有关联性的情况下定义中缀运算符,是否可以使用这些运算符?是否可以为中缀运算符设置默认关联性,以便具有关联性的运算符的行为就像具有默认关联性一样?