The question of interconverting between @ and ~ etc seems to come up
more often than I had expected. I'm not sure if this is simply due to
immature library design or whether it will continue to be true going
forward. But adding `@*`, `&*`, and `~*` as operators in their own
right might be a good way to address the problem, though there will
always be other ways that `@T` and `@[T]` are not interchangeable.
Niko
Patrick Walton wrote:
On 12/5/12 6:07 PM, Niko Matsakis wrote:
Great article. Regarding why ~[T] and ~T behave somewhat differently,
the reason is that the size of [T] is not known to the compiler! It's
kind of like how in C, if you have T[3], that's a perfectly fine type,
but T[] is sort of a degenerate type that gets converted to T*
willy-nilly. The reason is that the compiler can't really manipulate an
"unknown number of T's in a row", which is what [T] (Rust) and T[] (C)
represent. As an example, it can't put such a value on the stack, since
it doesn't know how much stack space to allocate (well, it can't put
that on the stack without using alloca() or something similar).
We have talked about special-casing "&*" in the grammar to mean
"borrow" regardless of the type of pointer, and we could also
conceivably special-case "@*" and "~*", which would make what you
wrote work. Basically you would be permitted to dereference
&[T]/@[T]/~[T]/&str/@str/~str for the sole purpose of borrowing it or
copying its contents into another heap.
Patrick
_______________________________________________
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