如何制作动态索引以获取元组的值?

问题描述 投票:0回答:1

在Python中,我了解到我可以通过动态索引检索元组值:

data = (1,2,3,4)
data[0]

for a in range(len(data)):
   print(data[a])

输出:

1
2
3
4

如何在Rust中做到这一点?

我试过这样的事情:

fn main() {
    let data = (12, 3, 4, 5);
    for a in 0..100 {
        println!("{}", data.a);
    }
}

但它不起作用,它只给我一些错误。

rust tuples
1个回答
3
投票

正如其他人所指出的,你可能想要使用数组或Vec<T>代替。

作为the book explains,元组是异构数据类型:每个元组元素可以具有不同的类型。如果你可以迭代所有元组值,可能会发生奇怪的事情:

let data = (12, true);
for a in 0..data.len() {
    // Oops: `+ 1` makes sense for the integer, but not for the bool
    println!("{}", data.a + 1); 
}

另一方面,数组是同类型:所有元素都具有相同的类型!因此,上面的代码段中的问题不会发生。 Vec<T>也是如此:只能存储T类型的元素。 Vec<T>和数组之间的区别:向量可以增长,即动态调整大小,而数组在编译时具有固定大小。

这是带有数组的代码片段(Playground):

let data = [12, 3, 4, 5];
for a in 0..data.len() {
    println!("{}", data[a]);
}

但是,当然,如果需要(例如for elem in &data),您可以迭代像数组之类的集合而无需迭代索引。

作为最后一点:当然,通过执行unsafe指针魔术来创建动态元组索引在技术上是可行的 - 假设您只在元组中存储相同的类型。但这几乎没有必要,应该避免。这就是为什么我甚至不会显示代码如何做到这一点。

© www.soinside.com 2019 - 2024. All rights reserved.