Cla*_*oft 4 operators ternary-operator associativity swift
我无法理解三元运算符上下文中的结合性概念。在大多数情况下,三元运算符如下所示:
a ? b : c
Run Code Online (Sandbox Code Playgroud)
在这种情况下,不需要结合性来计算表达式。但有时,三元运算符是嵌套的:
a ? b : c ? d : e
a ? b : (c ? d : e) // : is right-associative
Run Code Online (Sandbox Code Playgroud)
然而,嵌套也可以颠倒过来
a ? b ? c : d : e
a ? (b ? c : d) : e // : is left-associative
Run Code Online (Sandbox Code Playgroud)
解释这一现象的最佳方法是什么?您是否可以认为运算符的关联性:取决于上下文,或者我在这里遗漏了一些东西?
当人们想要定义自己的三元运算符时,结合性问题就变得相关了,例如在 Swift 中:
infix operator ? { associativity right precedence 120 }
infix operator : { associativity left precedence 130 }
Run Code Online (Sandbox Code Playgroud)
三元运算符是右关联的,正如我们在第一个示例中看到的那样(正如我们在下面看到的,如果我们想让相应的块包含除if-else计算为布尔值的表达式之外的任何内容,这是我们唯一的选择)。请注意,您的第二个示例没有留下任何空间关联性,因此它不会显示三元运算符的任何左关联性的示例。
/* example 1 */
a ? b : c ? d : e
==> { right-ass. } => a ? b : (c ? d : e), OK
==> { left-ass. } => (a ? b : c) ? d : e
/* |___|
\ not OK: since then both of these must be
booleans: that is restriction we don't have */
/* example 2 */
a ? b ? c : d : e
==> { only-valid-splitup } => a ? (b ? c : d) : e
(a ? b ? c) : d : e
/* |___|
\ not valid, there's no ? ? ternary operator */
a ? b ? (c : d : e)
/* |___|
\ not valid, there's no : : ternary operator */
Run Code Online (Sandbox Code Playgroud)
因此,即使嵌套三元运算符表达式,三元运算符的结合性也是明确定义的。但请注意,这样做会降低代码的可读性,甚至在语言指南 - 基本运算符中强烈建议不要这样做
...
但是,请谨慎使用三元条件运算符。如果过度使用,它的简洁性可能会导致代码难以阅读。避免将三元条件运算符的多个实例组合到一个复合语句中。
三元运算符是一个特殊的运算符,与 Swift 中的任何其他运算符并不真正直接相关;所有其他都属于一元和二元运算符家族。
一元运算符...
二元运算符...
三元运算符对三个目标进行操作。与 C 一样,Swift 只有一个三元运算符,即三元条件运算符 (a ? b : c)。
来自语言指南 - 基本运算符。
由于我们只允许在 Swift 中自定义我们自己的prefix(一元)和infix(二元)运算符,我怀疑您将很难实现自己的真正的三元运算符,因为您只能将其用作两个单独的一元中缀运算符?和,这自然与单个三元:运算符不同。(你总是可以看看Nate Cook 写的这篇有点老的博客文章,解释了如何通过使用两个二元运算符来模拟三元运算符,但是由于柯里化将在 Swift 3 中删除,我不知道这对于未来的 Swift 版本)。
| 归档时间: |
|
| 查看次数: |
2613 次 |
| 最近记录: |