像str类型,pub const fn len(&self) -> usize
,len方法会返回usize;
像迭代器,fn nth(&mut self, n: usize) -> Option<Self::Item>
,nth方法接受usize作为参数。
这样的设计意义何在?为什么不直接使用u32或u64呢,比如像整数类型的pow方法只会接受u32作为参数?
1
共 4 条评论, 1 页
像str类型,pub const fn len(&self) -> usize
,len方法会返回usize;
像迭代器,fn nth(&mut self, n: usize) -> Option<Self::Item>
,nth方法接受usize作为参数。
这样的设计意义何在?为什么不直接使用u32或u64呢,比如像整数类型的pow方法只会接受u32作为参数?
评论区
写评论usize指该平台上理论上内存对象的最大大小,一般就是指指针能表示的地址空间。是一个与程序位数,平台都相关的类型,毕竟不同平台的指针从8位到64位都可以有。C++里也有个size_t,各种容器返回的大小就是size_t,跟usize是一样的。 不过这种设计在现在看来有点多余了,32位大小基本上是用不完的(很少存单个好几个G的对象)。所以因为使用int默认大小而溢出错误的可能性极低。然后由于标准库用的无符号,大家写代码却常用有符号,经常就是直接for(int i=0balabala,然后C++允许隐式转换,特别是用泛型的时候,使用的时候如果没注意类型,在循环的时候容易把无符号当有符号用,出现减到0溢出的情况,反倒比大小溢出更容易出问题。所以C++在20标准加了个std::ssize,允许自动转换为有符号的大小。 Rust则是直接官方要求你都用usize,而且不允许隐式转换,提醒你要注意类型,各种迭代都是推荐用usize的,比C++要统一,所以也不提供有符号的了,就是有时候必须要转成有符号要显式转换一下。
强制usize是为了防止写程序时候出BUG的
就比如C++里,你很有可能写出类似
for(auto i=vec.size()-1;i>=0;i--)
这样的死循环(size返回一个unsigned类型的数据,auto推断时候自动把i写成unsigned,这样的数据一定大于等于0,也就形成了死循环)如果约定一致,不会出现类似的BUG
就像c、c++中的 int, uint,一样用得很多。
usize 大小跟平台有关,如果是 u32 在 64 位平台就没法覆盖全部寻址空间