我应该如何用i32调用Vec :: with_capacity?

and*_*man 5 rust

我有一个在堆栈上分配向量的函数.此代码不起作用:

fn my_func(n: i32) {
    let mut v = Vec::with_capacity(n);
}
Run Code Online (Sandbox Code Playgroud)

编译器说n需要成为一个usize.我认为从类型安全的角度来看,这是有道理的,但我需要n在其他需要i32调用的计算中使用.处理这个问题的正确方法是什么?

DrY*_*Yap 7

给USIZE.

let n: i32 = 4;
let v = Vec::<i16>::with_capacity(n as usize);
Run Code Online (Sandbox Code Playgroud)

  • @DrYap,我相信将`i32`重构为'usize`并不是惯用的方法.据我所知,建议尽可能少地使用指针大小的整数,因此转换为"usize"*是惯用法.如果您要从大小类型进行转换,则需要添加一个检查,确保该数字确实是正数. (3认同)
  • @DrYap一个小小的问题:在Rust中施放是*安全的*.将'-4 as usize`转换为大小会给你一个大的正数,但这不符合Rust用来定义"不安全"的非常具体的标准.(这是关于记忆安全的声明.) (3认同)
  • 如果可能,最好的方法是将“i32”重构为“usize”。否则,我认为这是您唯一的选择。在 Rust 中强制转换是不安全的,因此 `i32` 中的 `-4` 将成为一个很大的正 `usize`,因此您可能想要对这些值进行一些测试,但根据您的情况,这种开销可能是不必要的。 (2认同)