Thanks! That’s very nice to hear!
You are right that it’s not strictly required, but as Rust is a systems programming language, no one would agree to add an unneeded level of indirection just for the sake of consistency. So keeping the same performance is very important.
I haven’t thought about &mut [T]. I wonder how frequently it’s being used. Perhaps it can be replaced with a struct that contains a &mut T reference to the first element and a length? If it can’t, then my proposal doesn’t handle &mut [T]. Too bad!
I have dropped my idea about Ref<'a, T>, to avoid extra complexity in the language. So now &Foo would always be a view of Foo, and would always behave the same way, but may be implemented either as a value copy or as a pointer, according to the type attributes. I agree that it would make the implementation more opaque than it is today. It can be seen as an optimization - think about &Foo as a pointer to Foo, and if the author of the library thought that it would be more efficient to pass it by copying the bytes, it would work that way.
I don’t see &String and String as inconsistent. According to my proposal, &String would have just the same functionality as &String has now - you won’t be able to distinguish between the two without size_of. It’s just an optimization - if you are not allowed to mutate the object, you have no interest in the capacity, so there’s no need to copy it.
Edit: Currently Vec has a method pub fn capacity(&self) -> uint, which would of course not work with my proposal. From what I can see, it could be replaced by pub fn capacity(&mut self) -> uint without causing any trouble.