forked from rust-lang/rust
    
        
        - 
                Notifications
    You must be signed in to change notification settings 
- Fork 0
Bikeshed impl method extraction
        Dretch edited this page Apr 29, 2012 
        ·
        1 revision
      
    The idea is to allow a method to be extracted - as a function - from an impl that is scope.
For example, given this currently valid code:
iface hash {
    fn hash () -> uint;
}
iface equals {
    fn equals (other: self) -> bool;
}
impl of hash for uint {
    fn hash () -> uint {
        uint::hash(self)
    }
}
impl of equals for uint {
    fn equals (other: uint) -> bool {
        self == other
    }
}
A hashmap constructor function could be defined that takes the hashfn and eqfn from the scope of the function call, so they dont have to be given explicitly:
fn hashmap <K:hash equals copy, V:copy> () -> std::map::hashmap<K, V> {
    let hashfn = extract hash<K>.hash;     // hashfn has type `fn(K) -> uint`
    let eqfn   = extract equals<K>.equals; // eqfn has type `fn(K, K) -> bool`
    ret std::map::hashmap(hashfn, eqfn);
}
In the above code (which is not currently valid), there is a new keyword called extract. The expression extract path-to-iface<type>.method extracts a method from whichever impl is in scope for iface (if any). The method is extracted as a function with self added as a new argument before the method's existing arguments.
The hashmap function could then be called like:
let map = hashmap();
map.insert(4u, "abc");