6

Rust 参考目前asoperator进行了以下说明:

7.2.12.5 类型转换表达式

类型转换表达式用二元运算符表示as

执行as表达式会将左侧的值转换为右侧的类型。

表达式示例as

fn average(values: &[f64]) -> f64 {
  let sum: f64 = sum(values);
  let size: f64 = len(values) as f64;
  sum / size
}

(另外,因为它是相关的:

7.2.12.8 运算符优先级

Rust 二元运算符的优先级顺序如下,从强到弱:

as
* / %
+ -
<< >>

)

天真地将其用作运算符似乎不起作用:

fn main() {
    let x = 100 as u16 << 8;
}

实际上并没有编译:

% rustc testing.rs
testing.rs:2:24: 2:25 error: expected type, found `8`
testing.rs:2    let x = 100 as u16 << 8;

带括号 — let x = (100 as u16) << 8;— 它编译。参考中的示例中不需要括号,但似乎在这里。这里的确切语法是什么?是否需要括号,除非这是 a 的唯一权利=?还是我只是做错了什么?

将其称为运算符有点奇怪,因为 RHS 似乎需要是一种类型,并且通常,我认为运算符具有两个表达式……</sub>

4

1 回答 1

13

这里的技巧是as在它的右手边使用一个类型,即as看起来像这样的语法: is expression 'as' type。之后的表达式as看起来有点像(开始)一个类型,它试图解析u16<<...好像u16有一个类型参数(一个带有前缀的类型的例子就是Foo<<T>::Bar>)。

这基本上只是特定的行为,<<因为它看起来像类型参数分隔符。如果使用的运算符不能出现在类型中的前导标识符之后,则它可以正常工作:

fn main() {
    let x = 100 as u16 - 8;
}
于 2015-08-19T18:23:40.887 回答