2016-04-25 9 views
0

In Rost übergeben werden, können Sie auf eine Fn in Bezug zu nehmen, wie documented:Kann ein Merkmal als Fn Referenz oder Schließung

fn call_with_one(some_closure: &Fn(i32) -> i32) -> i32 { 
    some_closure(1) 
} 
let answer = call_with_one(&|x| x + 2); 

aber ich möchte ein Merkmal, das schreiben, wenn sie umgesetzt, die Runnable kann an alles weitergegeben werden, das eine Fn() erwartet. Ist das möglich?

trait Runnable { 
    fn run(&self); 
} 

struct MyRunnable; 
impl Runnable for MyRunnable { 
    fn run(&self) {} 
} 

struct StructThatTakesClosure<'life> { 
    closure_field: &'life Fn(), 
} 

fn main() { 
    // is there a way to change the Runnable trait to automatically match the 
    // Fn() interface such that the MyRunnable instance can be passed directly? 
    StructThatTakesClosure { closure_field: &|| MyRunnable.run() }; 
} 

Ich habe versucht, die drei normalerweise extern Anrufe als Standardfunktionen der Umsetzung, aber ich habe es nicht geschafft es zum Laufen zu bringen.

Antwort

3

Dies ist nicht möglich auf stabilem Rost, weil die genaue definition of the Fn Eigenschaft instabil ist.

Am nächtlichen Rust können Sie die Fn Merkmale implementieren, aber nur für konkrete Typen, so dass es nicht sehr hilfreich ist.

impl<'a> std::ops::Fn<()> for MyRunnable { 
    extern "rust-call" fn call(&self,():()) { 
     self.run(); 
    } 
}