当前位置:  开发笔记 > 编程语言 > 正文

从泛型类型的trait调用静态方法

如何解决《从泛型类型的trait调用静态方法》经验,为你挑选了1个好方法。

我有一个特征,其中一个函数不self作为参数:

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

struct Dummy;

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

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

fn main() {}

库的用户需要为任何类型实现特征,通常是空结构.我的一个函数接受一个实现的泛型类型MyTrait.当我尝试function在泛型类型上调用该方法时,它给了我这个错误:

错误:没有为当前范围中的function类型命名的方法T

我在这个问题的答案中尝试了解决方案,但是我得到了同样的错误.如何在泛型类型上调用静态方法?



1> DK...:

当我尝试function在泛型类型上调用方法时,...

两件事:首先,取决于你想看它的方式,function 不是一种方法.它只是一个恰好存在于特征命名空间(也称为 "关联函数")的函数.

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

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

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

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

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

两者在语义上是相同的 ; 只是当你涉及很多特征时,第二个更具体,更有可能解决.

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有