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?
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.(But, as @fjh mentioned, it is far better to operate on an array
[i64; 3]
instead of a tuple(i64, i64, i64)
.)