它不应该是左结合的吗?
我认为
let a = b ?? c ?? d
被分组的方式类似于
let a = (b ?? c) ?? d
不是
let a = b ?? (c ?? d)
但它被声明为右结合。我是否有什么误解或遗漏了什么?
它不应该是左结合的吗?
我认为
let a = b ?? c ?? d
被分组的方式类似于
let a = (b ?? c) ?? d
不是
let a = b ?? (c ?? d)
我认为这是一种优化。左结合或右结合不会改变结果。
这个:
(b ?? c) ?? d
对于表达式b ?? c
的求值结果,将其作为x ?? d
左侧的操作数。即使b
不为空,合并运算符也会被执行两次。
在这种情况下,可以考虑使用:
b ?? (c ?? d)
b
不为nil,则右侧的表达式将不会被评估,因此不会执行。
infix operator !!! {
associativity left
precedence 110
}
func !!!<T>(optional: T?, defaultValue: @autoclosure () -> T?) -> T? {
if let value = optional {
println(optional)
return value
}
let def = defaultValue()
println(def)
return def
}
使用这个测试数据:
let a: String? = "a"
let b: String? = "b"
let c: String? = "c"
let d = a !!! b !!! c
Optional("a")
Optional("a")
Optional("a")
b ?? (c ?? d)
中,应该先计算(c ?? d),再检查b是否为nil,因为它们在括号内。所以即使b不是nil,这些表达式也不会被计算。 - Pitiphong Phongpattranontf() ?? g() ?? h()
,其中如果先调用g
,则f
可能会抛出异常等。在这种情况下,顺序很重要。 - Codie CodeMonkey