在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);
}
}
但它不起作用,它只给我一些错误。
正如其他人所指出的,你可能想要使用数组或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
指针魔术来创建动态元组索引在技术上是可行的 - 假设您只在元组中存储相同的类型。但这几乎没有必要,应该避免。这就是为什么我甚至不会显示代码如何做到这一点。