“包装类型时,”在当前范围内找不到类型T的方法“

时间:2016-08-07 09:44:27

标签: rust adapter

我正在尝试使用两种不同类型的适配器来完成相同的工作,我无法重写这两种类型。

X有一个消耗self的方法,因此运行时多态包装器不适用。唯一的选择是静态通用方法。

struct X {}

impl X {
    fn f(self, n: i32) {
        println!("n = {}", n);
    }
    fn new() -> X {
        X {}
    }
}

struct AdapterX {
    x: X
}

impl AdapterX {
    fn uf(self, n: i32) {
        self.x.f(n)
    }
    fn new(x: X) -> AdapterX {
        AdapterX { x: x }
    }
}

fn useAdapted<T>(a: T) {
    a.uf(10)
}

fn main() {
    let x = X::new();
    useAdapted::<AdapterX>(AdapterX::new(x));
}

编译器失败:

error: no method named `uf` found for type `T` in the current scope
    a.uf(10)
      ^~

2 个答案:

答案 0 :(得分:3)

问题在于:

fn useAdapted<T>(a: T) {
    a.uf(10)
}

这说

  

给我任何可能的类型,我会在其上调用uf方法

这显然是胡说八道,因为你可以传递StringboolHashMapFile或......(你明白了)。

没有方法uf适用于每个类型,因此编译器会告诉您。如您所发现,您必须在泛型类型上提供带有一个或多个 traits 绑定。这些特征的方法和相关函数将在方法中使用。

另请注意,Rust样式为snake_case;该函数应该被称为use_adapted

答案 1 :(得分:0)

我能够弄明白;不需要包装器结构。正确的方法是一般性特征。我也错过了泛型变量的类型范围。

struct X {}

impl X {
    fn f(self, n: i32) {
        println!("n = {}", n);
    }
    fn new() -> X {
        X {}
    }
}

trait Adapter<T> {
    fn uf(self, n: i32);
}

impl Adapter<X> for X {
    fn uf(self, n: i32) {
        self.f(n)
    }
}

struct Y {}

impl Y {
    fn g(self, n: f32) {
        println!("m = {}", n);
    }
    fn new() -> Y {
        Y {}
    }
}

impl Adapter<Y> for Y {
    fn uf(self, n: i32) {
        self.g(n as f32)
    }
}

fn use_adapted<A, T: Adapter<A>>(a: T) {
    a.uf(10)
}

fn main() {
    use_adapted(X::new());
    use_adapted(Y::new());
}