组合使用自定义运算符
Using custom operators in combination
假设我已经定义了一个前缀运算符 *
,以及一个与之关联的函数:
prefix operator * { }
prefix func * (value: Int) -> Bool {
return value == 5
}
函数 returns a Bool
,所以很明显要做的事情就是用 !
前缀运算符取反。
尝试这样做时,必须使用括号:
let myBool = !(*5)
有没有办法一起使用运算符:!*5
而不定义新的运算符:prefix operator !* { }
?
我会说这是不可能的。编译器将这 2 个运算符的组合视为单个运算符,无法识别。
甚至不可能在非运算符及其操作数之间添加 space,因为一元运算符必须是 "attached"。所以只剩下 2 个选项是您要避免的选项:
- 使用括号
- 定义一个新的
!*
运算符
请注意,即使编译器能够将它们解析为 2 个不同的运算符,也有可能无法正常工作。事实上,避免糖语法并将运算符用作普通函数,这是可行的:
let bool = (*)(5)
let not = (!)(bool)
但这不是:
(!)(*)(5)
虽然明确了优先级但它有效:
(!)((*)(5))
假设我已经定义了一个前缀运算符 *
,以及一个与之关联的函数:
prefix operator * { }
prefix func * (value: Int) -> Bool {
return value == 5
}
函数 returns a Bool
,所以很明显要做的事情就是用 !
前缀运算符取反。
尝试这样做时,必须使用括号:
let myBool = !(*5)
有没有办法一起使用运算符:!*5
而不定义新的运算符:prefix operator !* { }
?
我会说这是不可能的。编译器将这 2 个运算符的组合视为单个运算符,无法识别。
甚至不可能在非运算符及其操作数之间添加 space,因为一元运算符必须是 "attached"。所以只剩下 2 个选项是您要避免的选项:
- 使用括号
- 定义一个新的
!*
运算符
请注意,即使编译器能够将它们解析为 2 个不同的运算符,也有可能无法正常工作。事实上,避免糖语法并将运算符用作普通函数,这是可行的:
let bool = (*)(5)
let not = (!)(bool)
但这不是:
(!)(*)(5)
虽然明确了优先级但它有效:
(!)((*)(5))