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

Ari*_*tra 2 tuples rust

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

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

for a in range(len(data)):
   print(data[a])
Run Code Online (Sandbox Code Playgroud)

输出:

1
2
3
4
Run Code Online (Sandbox Code Playgroud)

如何在 Rust 中做到这一点?

我试过这样的事情:

1
2
3
4
Run Code Online (Sandbox Code Playgroud)

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

Luk*_*odt 5

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

正如书中所解释的,元组是异构数据类型:每个元组元素可以有不同的类型。如果您可以遍历所有元组值,可能会发生奇怪的事情:

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

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

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

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

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

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