2015-10-21 40 views
3

在Rust中有一种方法可以返回一个实现某个函数的特定类型(我不想要实例,但是类型)。像这样的东西(不以目前的形式工作):返回一个类型,而不是一个实例

trait MyTrait { 
    fn sum(&self, val: i64) -> i64; 
} 

#[derive(Debug)] 
struct X { 
    x: i64, 
} 

impl MyTrait for X { 
    fn sum(&self, val: i64) -> i64 { 
     self.x + 2 * val 
    } 
} 

#[derive(Debug)] 
struct Y { 
    x: i64, 
} 

impl MyTrait for Y { 
    fn sum(&self, val: i64) -> i64 { 
     self.x + 3 * val 
    } 
} 

fn from_name(name: &str) -> MyTrait { 
    match name { 
     "X" => X, 
     "Y" => Y, 
     _ => panic!("Unknown name") 
    } 
} 

fn main() { 
    let x = X{x: 21}; 
    let y = Y{x: 42}; 

    // This does not work, it is just to show the idea 
    let z = from_name("X"){x: 10}; 

    println!("x {:?}", x.sum(3)); 
    println!("y {:?}", y.sum(3)); 
    println!("z {:?}", z.sum(3)); 
} 

回答

3

最接近的事情你问的是一个工厂函数:

fn from_name(name: &str) -> Box<Fn(i64) -> Box<MyTrait>> { 
    match name { 
     "X" => Box::new(|x| Box::new(X{x: x})), 
     "Y" => Box::new(|x| Box::new(Y{x: x})), 
     _ => panic!("Unknown name"), 
    } 
} 

fn example() -> i64 { 
    let factory = from_name("X"); 
    let z = factory(10); 
    z.sum(10) 
} 

from_name返回它返回一个对象的函数。

+2

注意,您可以在不需要关闭的情况下执行此操作,甚至可能不需要通过枚举等“盒”特征对象。 'enum Maker {X,Y}'由'from_name'返回,其方法类似于'fn make(&self,i64) - > Value',其中'枚举值{X(X),Y(Y)}'。 – huon

相关问题