How to access the element at variable index of a t

2019-07-02 11:40发布

I'm writing a function to read vectors from stdin, and here is what I have so far:

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!
    }
}

However, the annotated line contains an 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!");
   |             ^

Reading the documentation entry doesn't reveal any get, or similar function.

So, is there any way to get the ith value of a tuple?

标签: rust
3条回答
我只想做你的唯一
2楼-- · 2019-07-02 12:13

There isn't a way built in the language, because variable indexing on a heterogeneous type like a tuple makes it impossible for the compiler to infer the type of the expression.

You could use a macro that unrolls a for loop with variable indexing for a tuple if it is really, really necessary though.

If you are going to be using homogeneous tuples that require variable indexing, why not just use a fixed-length array?

查看更多
Ridiculous、
3楼-- · 2019-07-02 12:30

So, is there any way to get the ith value of vec?

No, there isn't. Since tuples can contain elements of different types, an expression like this wouldn't have a statically-known type in general.

You could consider using an array instead of a tuple.

查看更多
再贱就再见
4楼-- · 2019-07-02 12:32

While there are no built-in methods to extract the i-th value for non-constant i, there exist crates like tuple to implement dynamic indexing of a homogeneous tuple.

extern crate tuple;

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

(But, as @fjh mentioned, it is far better to operate on an array [i64; 3] instead of a tuple (i64, i64, i64).)

查看更多
登录 后发表回答