如何在元组的变量索引处访问元素?

时间:2017-04-03 05:06:46

标签: rust

我正在编写一个从stdin读取向量的函数,这是我到目前为止所做的:

fn read_vector() -> (i64, i64, i64) {
    let mut vec = (0, 0, 0);
    let mut value = String::new();

    for i in 0..3 {
        io::stdin().read_line(&mut value).expect("Failed to read line");
        vec.i = value.trim().parse().expect("Failed to read number!"); // error!
    }
}

但是,带注释的行包含错误:

error: no field `i` on type `({integer}, {integer}, {integer})`
  --> src/main.rs:13:13
   |
13 |         vec.i = value.trim().parse().expect("Failed to read number!");
   |             ^

阅读文档entry并未显示任何get或类似功能。

那么,有没有办法获得元组的i值?

3 个答案:

答案 0 :(得分:9)

该语言没有内置方式,因为异构类型的变量索引(例如tuple)使编译器无法不可能推断表达式的类型。

你可以使用一个宏来展开一个带有变量索引的for循环的元组,如果它真的是,真的是必需的。

如果您打算使用需要变量索引的同构元组,为什么不使用固定长度的数组?

答案 1 :(得分:5)

  

那么,有没有办法得到vec的第i个值?

不,没有。由于元组可以包含不同类型的元素,因此像这样的表达式通常不具有静态已知类型。

您可以考虑使用数组而不是元组。

答案 2 :(得分:2)

虽然没有内置方法可以为非常量 i 提取 i -th值,但是存在tuple之类的包来实现{ 同类元组的{3}}。

extern crate tuple;

...
*vec.get_mut(i).unwrap() = value.trim().parse().expect("!");

(但是,正如dynamic indexing提到的那样,对数组[i64; 3]而不是元组(i64, i64, i64)进行操作要好得多。)