2014-02-20 44 views

回答

6

你可以嘗試建立一個宏說:

#[feature(macro_rules)]; 

macro_rules! compose_inner(
    ($var:ident, $f:ident) => (
     $f($var) 
    ); 
    ($var:ident, $f:ident $($rest:ident)+) => (
     $f(compose_inner!($var, $($rest)+)) 
    ); 
) 


macro_rules! compose(
    ($($f:ident)+) => (
     |x| compose_inner!(x, $($f)+) 
    ) 
) 

fn foo(x: int) -> f64 { 
    (x*x) as f64 
} 

fn bar(y: f64) -> ~str { 
    (y+2.0).to_str() 
} 

fn baz(z: ~str) -> ~[u8] { 
    z.into_bytes() 
} 

fn main() { 
    let f = compose!(baz bar foo); 
    println!("{:?}", f(10)); 
} 

宏可能會更簡單,但是這就是我想出了。

但語言本身並不支持它。畢竟,生鏽並不是一種功能性和連續性的語言。

非常相似的成語是方法鏈接,這是絕對支持的鏽。最突出的例子,我想,讓迭代器轉換:

let v: ~[int] = ...; 
let x: int = v.iter().map(|x| x + 1).filter(|x| x > 0).fold(0, |acc, x| acc + x/2); 

誠然,這是不是任意函數組成靈活,但它看起來更自然,感覺方便多了。

相關問題