Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust &引用;在当前范围内找不到类型T的方法;包装字体时_Rust_Adapter - Fatal编程技术网

Rust &引用;在当前范围内找不到类型T的方法;包装字体时

Rust &引用;在当前范围内找不到类型T的方法;包装字体时,rust,adapter,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

我试图围绕两种不同类型的适配器来完成相同的工作,但我无法重写这两种类型

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

我能把它弄明白;不需要包装器结构。正确的方法是一种普遍的特征。我还错过了泛型类型变量的类型范围

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());
}
struct X{}
implx{
fn f(自我,n:i32){
println!(“n={}”,n);
}
fn new()->X{
X{}
}
}
特征适配器{
fn-uf(self,n:i32);
}
用于X的impl适配器{
fn uf(自我,n:i32){
self.f(n)
}
}
结构Y{}
简单的{
fn g(自我,n:f32){
println!(“m={}”,n);
}
fn new()->Y{
Y{}
}
}
用于Y的impl适配器{
fn uf(自我,n:i32){
self.g(n为f32)
}
}
fn使用自适应(a:T){
a、 uf(10)
}
fn main(){
使用_-adapted(X::new());
使用_-adapted(Y::new());
}
问题在于:

fn useAdapted<T>(a: T) {
    a.uf(10)
}
fn使用自适应(a:T){
a、 uf(10)
}
这是说

给我任何可能的类型,我将调用
uf
方法

这显然是胡说八道,因为您可以传入
字符串
bool
HashMap
文件
或。。。。(你明白了)

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


还请注意,锈蚀类型为“蛇壳”;应该调用函数
use_adapted

如何设置此绑定?@mjwrazor如果向下滚动一点,就会看到。