< 返回版块

imrewang 发表于 2023-04-15 21:35

Tags:求助

问:为什么rust中使用isize或者usize作为某些集合的索引?

chatgpt回答:在 Rust 中,isize 和 usize 通常用作集合的索引类型,因为它们的大小可以自适应计算机架构。使用这些类型作为索引类型,可以确保代码在不同的计算机架构上都能够正常工作,而无需进行任何更改。

这意味着,在不同的计算机架构上,isize 和 usize 的大小会自适应计算机架构。例如,在 64 位架构上,isize 和 usize 的大小为 64 位,而在 32 位架构上,它们的大小为 32 位。

这种自适应的特性使得使用 isize 或 usize 作为索引类型更加灵活,因为代码可以在不同的计算机架构上编译和运行,而无需进行任何更改。这意味着您可以编写一次代码,然后将其移植到不同的计算机架构上,而无需担心类型大小不匹配的问题。

关于使用 isize 或 usize 作为索引类型更加灵活,因为代码可以在不同的计算机架构上编译和运行怎么理解呢

--------以下为初始问题------已解决-----------------------

问题

let v=vec![i32::MAX;(amount+1) as usize];

vec取值要 v[x as usize] 我理解

为什么定义中要(amount+1) as usize ?这个as usize又是为什么呢

--------以上为初始问题------已解决-----------------------

评论区

写评论
gorust21 2023-04-16 08:28

就是为了安全检查

作者 imrewang 2023-04-15 22:52

谢谢,知道了

对于容器来说,usize表达元素数量这件事情是合理的。既然索引的时候应该使用usize,定义的时候也应该用usize

另一个问题

问:为什么rust中使用isize或者usize作为某些集合的索引?

chatgpt回答:在 Rust 中,isize 和 usize 通常用作集合的索引类型,因为它们的大小可以自适应计算机架构。使用这些类型作为索引类型,可以确保代码在不同的计算机架构上都能够正常工作,而无需进行任何更改。

这意味着,在不同的计算机架构上,isize 和 usize 的大小会自适应计算机架构。例如,在 64 位架构上,isize 和 usize 的大小为 64 位,而在 32 位架构上,它们的大小为 32 位。

这种自适应的特性使得使用 isize 或 usize 作为索引类型更加灵活,因为代码可以在不同的计算机架构上编译和运行,而无需进行任何更改。这意味着您可以编写一次代码,然后将其移植到不同的计算机架构上,而无需担心类型大小不匹配的问题。

关于使用 isize 或 usize 作为索引类型更加灵活,因为代码可以在不同的计算机架构上编译和运行怎么理解呢?

--
👇
MrZLeo: 可以先把宏

fn main() {
    let v = vec![0; 23 as usize];
}

展开成函数调用:

fn main() {
    let v = ::alloc::vec::from_elem(0, 23 as usize);
}

可以看到真正调用的函数是vec::from_elem,具体实现:

#[doc(hidden)]
#[cfg(not(no_global_oom_handling))]
#[stable(feature = "rust1", since = "1.0.0")]
pub fn from_elem<T: Clone>(elem: T, n: usize) -> Vec<T> {
    <T as SpecFromElem>::from_elem(elem, n, Global)
}

函数调用的n的类型就是usize。

对于容器来说,usize表达元素数量这件事情是合理的。既然索引的时候应该使用usize,那为什么定义的时候不应该呢?why not : )

--
👇
imrewang: 编译器只是让在声明时采用vec![0;i as usize],我知道改成as usize就对了,但为什么这里也要用usize类型

取值let value = v[i as usize];是容易理解的

定义let v = vec![0; 23usize];是不理解的

--
👇
MrZLeo: 有一个解决这个问题的简单方法:把as usize去掉,然后编译器会告诉你出了什么错

MrZLeo 2023-04-15 22:36

可以先把宏

fn main() {
    let v = vec![0; 23 as usize];
}

展开成函数调用:

fn main() {
    let v = ::alloc::vec::from_elem(0, 23 as usize);
}

可以看到真正调用的函数是vec::from_elem,具体实现:

#[doc(hidden)]
#[cfg(not(no_global_oom_handling))]
#[stable(feature = "rust1", since = "1.0.0")]
pub fn from_elem<T: Clone>(elem: T, n: usize) -> Vec<T> {
    <T as SpecFromElem>::from_elem(elem, n, Global)
}

函数调用的n的类型就是usize。

对于容器来说,usize表达元素数量这件事情是合理的。既然索引的时候应该使用usize,那为什么定义的时候不应该呢?why not : )

--
👇
imrewang: 编译器只是让在声明时采用vec![0;i as usize],我知道改成as usize就对了,但为什么这里也要用usize类型

取值let value = v[i as usize];是容易理解的

定义let v = vec![0; 23usize];是不理解的

--
👇
MrZLeo: 有一个解决这个问题的简单方法:把as usize去掉,然后编译器会告诉你出了什么错

作者 imrewang 2023-04-15 22:23

编译器只是让在声明时采用vec![0;i as usize],我知道改成as usize就对了,但为什么这里也要用usize类型

取值let value = v[i as usize];是容易理解的

定义let v = vec![0; 23usize];是不理解的

--
👇
MrZLeo: 有一个解决这个问题的简单方法:把as usize去掉,然后编译器会告诉你出了什么错

MrZLeo 2023-04-15 21:43

有一个解决这个问题的简单方法:把as usize去掉,然后编译器会告诉你出了什么错

1 共 5 条评论, 1 页