在Rust中,"as"是一个运营商吗?

Tha*_*tos 5 grammar binary-operators rust

Rust Reference目前as运营商说:

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
}
Run Code Online (Sandbox Code Playgroud)

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

7.2.12.8运算符优先级

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

as
* / %
+ -
<< >>
Run Code Online (Sandbox Code Playgroud)

)

天真地使用它作为运算符似乎不起作用:

fn main() {
    let x = 100 as u16 << 8;
}
Run Code Online (Sandbox Code Playgroud)

实际上没有编译:

% rustc testing.rs
testing.rs:2:24: 2:25 error: expected type, found `8`
testing.rs:2    let x = 100 as u16 << 8;
Run Code Online (Sandbox Code Playgroud)

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

这被称为运算符有点奇怪,因为RHS似乎需要是一个类型,通常,我认为运算符采用两个表达式......

huo*_*uon 11

这里的诀窍是as右侧有一个类型,即as看起来像是的语法expression 'as' type.as看起来有点像(一开始)类型之后的表达式,它试图解析u16<<...好像u16有一个类型参数(一个带有类似前缀的类型的例子Foo<<T>::Bar>).

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

fn main() {
    let x = 100 as u16 - 8;
}
Run Code Online (Sandbox Code Playgroud)