2016-04-25 3 views
0

ржавчиной, вы можете взять в качестве ссылки к Fn в documented:Может черта передается в качестве ссылки Fn или закрытия

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

Однако я хочу, чтобы написать признак, который, в случае его реализации Runnable может быть передано на все, что ожидает Fn(). Это возможно?

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() }; 
} 

Я попытался реализации вызовов 3 обычно extern как функции по умолчанию, но я не смог заставить его работать.

ответ

3

Это невозможно для стабильной ржавчины, поскольку точная характеристика definition of the Fn нестабильна.

На ночной ржавчине вы можете реализовать черты Fn, но только для конкретных типов, поэтому это не очень полезно.

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