Hi, Daniel,
Consider this example:
let vec = vec![(1u, 2u)];
for &(a, b) in vec.iter() {
println!("{}: {}", a, b);
}
a and b here are of type uint, which is implicitly copyable. It is not
natural to take references to it when passing around its values. That
is, variables under & pattern are not *always* taken as a reference.
Another reason is consistency. Patterns and corresponding constructor
expressions are meant to be inverses of each other:
let x = &(1u, 2i);
match x {
&(a, b) => ...
}
See how nicely `&(a, b)` and `&(1, 2)` correspond to each other. `a`
is of type uint, just like the literal 1u, and `b` is int, like 2i.
This expands to other types too, including complex ones like `Box`.
With automatic references there won't be such consistency.
2014-11-10 20:29 GMT+03:00 Daniel Trstenjak <[email protected]>:
>
> Dear rust devs,
>
> let vec = vec![("a".to_string(), "b".to_string())];
>
> for &(ref a, ref b) in vec.iter() {
> println!("{}: {}", a, b);
> }
>
> I understand that the '&' and 'ref' are needed here, because otherwise
> the 'String' could be moved out of the 'Vec'.
>
> I don't quite understand, why there's the need for these explicit refs,
> why isn't the outer '&' enough to indicate that everything inside of
> the pattern is also referenced?
>
> Why isn't it possible to just have (with the same semantics):
>
> for &(a, b) in vec.iter() {
> println!("{}: {}", a, b);
> }
>
>
> Without these refs pattern matching would be aesthetically more in sync
> with the types, which I would consider very pleasing.
>
>
> Greetings,
> Daniel
> _______________________________________________
> Rust-dev mailing list
> [email protected]
> https://mail.mozilla.org/listinfo/rust-dev
_______________________________________________
Rust-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/rust-dev