相关疑难解决方法(0)

如何安全地和惯用地在数字类型之间进行转换?

从(比方说)a转换usize为a 的惯用方法是u32什么?

例如,铸造用4294967295us as u32作品和类型强制转换锈参考文档

数值可以转换为任何数字类型.原始指针值可以转换为任何整数类型或原始指针类型.任何其他强制转换都不受支持,无法编译.

但是4294967296us as u32会默默地溢出并给出0的结果.

我发现ToPrimitiveFromPrimitive提供了很好的功能ToPrimitive,但它们目前被标记为不稳定:

FromPrimitive

什么是在数字(和指针)类型之间转换的惯用(和安全)方式?

更新:to_u32() -> Option<u32>/的可变大小#[unstable(feature = "core", reason = "trait is likely to be removed")]是我问这个问题的一个原因 - 原始场景是我想转换isizeusize所以我可以代表一个树u32(例如usize,然后获得节点2的祖父将be Vec<u32>),我想知道如果let t = Vec![0u32, 0u32, 1u32]小于32位会如何失败.

casting numbers rust

38
推荐指数
1
解决办法
3万
查看次数

整数之间的铸造是否昂贵?

我正在进行一项项目,我正在进行大量基于索引的计算.我有几行像:

let mut current_x: usize = (start.x as isize + i as isize * delta_x) as usize;
Run Code Online (Sandbox Code Playgroud)

start.x并且iusizes和delta_x类型isize.我的大多数数据都是无符号的,因此将其签名存储没有多大意义.另一方面,当我操作一个数组时,我正在访问很多,我必须将所有内容转换回来,usize如上所示.

整数之间的铸造是否昂贵?它对运行时性能有影响吗?

还有其他方法可以更轻松/更有效地处理索引算术吗?

rust

8
推荐指数
1
解决办法
719
查看次数

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

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

grammar binary-operators rust

5
推荐指数
1
解决办法
796
查看次数

From :: from和Rust之间有什么区别?

我可以使用from或之一在类型之间进行转换as:

i64::from(42i32);
42i32 as i64;
Run Code Online (Sandbox Code Playgroud)

那些有什么区别?

casting rust

3
推荐指数
1
解决办法
2247
查看次数

如何在Rust中将布尔值转换为整数?

如何在Rust中将布尔值转换为整数?与in一样,true变为1,然后false变为0。

rust

3
推荐指数
4
解决办法
1821
查看次数

标签 统计

rust ×5

casting ×2

binary-operators ×1

grammar ×1

numbers ×1