我有一个特点,就是一个函数不以self为参数:

trait MyTrait {
    fn function(x: i32) -> i32;
}

struct Dummy;

impl MyTrait for Dummy {
    fn function(x: i32) -> i32 {
        x * 2
    }
}

fn call_method<T: MyTrait>(object: T) {
    let x = object.function(2);
}

fn main() {}

库的用户需要为任何类型实现trait,通常是空 struct .一个实现了MyTrait个泛型函数.当我试图对泛型类型调用function方法时,它给出了以下错误:

错误:在当前作用域中找不到类型T的名为function的方法

我在回答this question的问题时try 了这个解决方案,但我得到了同样的错误.如何对泛型类型调用静态方法?

推荐答案

当我试图调用泛型类型上的function方法时...

两件事:首先,根据你想如何看待它,function isn't是一种方法.它只是一个恰好存在于trait名称空间中的函数(a.k.a.一个"关联函数").

第二,你试图在类型上调用function,你在该类型的值上调用它.这是不可能的,因为这又不是一种方法;它没有self参数.

解决方案是actually调用泛型类型上的function关联函数,如下所示:

fn call_method<T: MyTrait>(object: T) {
    let x = T::function(2);
}

有时候,这还不够具体.如果你需要更具体一些,你可以将以上内容写成:

fn call_method<T: MyTrait>(object: T) {
    let x = <T as MyTrait>::function(2);
}

两者在语义上是identical;只是当你有很多trait 的时候,第二个更具体,更容易解决.

Rust相关问答推荐

两个相关特征的冲突实现错误

有没有更好的方法从HashMap的条目初始化 struct ?

亚性状上位性状上的 rust 病伴生型界限

使用Clap时如何将String作为Into Str参数传递?

为潜在的下游实现使用泛型绑定而不是没有泛型绑定的trait

为什么允许我们将可变引用转换为不可变引用?

取得本地对象字段的所有权

Gtk4-rs:将监视器作为gdk::monitor获取,而不是作为glib::对象获取

在Rust中声明和定义一个 struct 体有什么区别

将Vec<;U8&>转换为Vec<;{Float}&>

由于生存期原因,返回引用的闭包未编译

Const 上下文:从 init 函数创建具有 const 通用长度的数组

如何将 struct 数组放置在另一个 struct 的末尾而不进行内存分段

UnsafeCell:它如何通知 rustc Select 退出基于别名的优化?

为什么切片时需要参考?

sha256 摘要仅适用于 &*

如何将 &[T] 或 Vec<T> 转换为 Arc<Mutex<[T]>>?

按下 Ctrl + C 时优雅地停止命令并退出进程

更好的方法来模式匹配带有 Rust 的窥视孔装配说明窗口?

Rust 生命周期:不能在方法内重新borrow 可变字段