在调查Why does the + function appear to work on tuples?后,我有以下问题。
有人可以解释为什么Base.:&(1,2)
有效但&(1,2)
失败了吗?
同时Base.:|(1,2)
和|(1,2)
都有效。
答案 0 :(得分:7)
原因很简单,&
作为一元运算符是一种特殊形式,因为它在ccall
语法中使用(尽管this syntax is deprecated now)。因此,&(1, 2)
被解析为Expr(:&, :(1, 2))
。
|
不是一元运算符,因此|(1, 2)
被解析为1 | 2
,即函数调用。+
和-
具有特殊情况解析规则,因此可以将+(1, 2)
和-(1, 2)
解析为双参数函数调用(否则它们将是单参数函数调用元组,这会在运行时出错)。 &
不受这些规则的约束,因为它是一种特殊形式,而不是普通的运营商。Base.:&
根本不被解析为运算符,而只是对标识符的普通字段引用。所以这里没有歧义,它被解析为普通的函数调用。类似地,(&)(1, 2)
被解析为普通函数调用,因为(&)
被解析为普通标识符。