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 i
th value of a tuple?
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?
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.
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)
.)