Rust Reference目前对the as
operator:
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;
- 它编译。参考中的示例中不需要parens,但似乎在这里。这里的确切语法是什么?除非这是=
的唯一权利,否则是否需要括号?或者我只是做错了什么?
这被称为运算符有点奇怪,因为RHS似乎需要是一个类型,通常,我认为运算符采用两个表达式......
答案 0 :(得分:10)
这里的诀窍是as
右侧有一个类型,即as
的语法看起来像是:expression 'as' type
。 as
之后的表达式看起来有点类似(开头)类型,它试图解析u16<<...
,好像u16
有一个类型参数(带有前缀的类型的示例)那就是Foo<<T>::Bar>
)。
这基本上只是<<
特有的行为,因为它看起来像是类型参数分隔符。如果使用的运算符不能出现在类型中的前导标识符之后,则可以正常工作:
fn main() {
let x = 100 as u16 - 8;
}