我正在尝试使用两种不同类型的适配器来完成相同的工作,我无法重写这两种类型。
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)
^~
答案 0 :(得分:3)
问题在于:
fn useAdapted<T>(a: T) {
a.uf(10)
}
这说
给我任何可能的类型,我会在其上调用
uf
方法
这显然是胡说八道,因为你可以传递String
或bool
或HashMap
或File
或......(你明白了)。
没有方法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());
}