You can already basically do this.
type Ref<'a, T> = &'a T;
type RefMut<'a, T> = &'a mut T;
trait BorrowExt {
fn borrow(&self) -> Ref<Self>;
fn borrow_mut(&mut self) -> RefMut<Self>;
}
impl<T> BorrowExt for T {
#[inline] fn borrow(self: Ref<Self>) -> Ref<Self> { self }
#[inline] fn borrow(self: RefMut<Self>) -> RefMut<Self> { self }
}
// ...
use borrow::{ Ref, RefMut, BorrowExt };
let foo: Ref<i32> = 0.borrow();
and use it in your code, never once writing a & (bitmasking and booleans don’t exist, duh /s). It’s even kosher as a self type, because fn foo(self: &Self) is what fn foo(&self) desugars to. (Cool huh?)
Of course… this will earn you weird looks, so I recommend against it.
Mind, Rust used to be far more sigiltastic: not only do you have &T and *T for borrowed and raw pointers, but you also have ~T for owning pointers (what we call Box<T>, Vec<T> (for ~[T]) and String for (for ~str) today, and @T (back when Rust had, horror of horrors, a garbage collector) for a GC’d pointer.
I think that sigils are usually a bad idea (see Perl or Ruby, which are very sigiltastic in different but equally unreadable ways), but borrowing is so utterly fundamental to any nontrivial Rust program that it deserves a sigil, just like slices (and arrays) have their brackets, lifetimes their ticks (also- saying “tick-a” out loud is fun), and macros their bangs. None of these are necessary, but I’d much rather read [T; n] over Array<T, n> (cough std::array<T, n>) and &'a T over Ref<'a, T>. They’re not just short… they’re to the point.
The ampersand being alien to non-C folks also has the nice advantage that it doesn’t have a cemented meaning to most people, so we can get away with calling it “borrow” instead of “address-of”, while still looking like and doing approximately what it does in C (except, you know, the bit about our friend tick-a).
Also reading &'a T as “and tick-a T” is fun. =p