首页 > 解决方案 > 为什么在调用结构的函数时会出现“使用未声明的类型或模块”错误?

问题描述

我在 Rust 中有以下代码:

trait MyTrait {
    fn get_value() -> &'static str;
}

#[derive(Debug)]
struct MyStruct;

impl MyTrait for MyStruct {
    fn get_value() -> &'static str {
        "has value"
    }
}


fn main() {
    println!("My value: {}", MyStruct::get_value());
    has_trait(MyStruct);
}

fn has_trait<T>(trt: T) where T: MyTrait + std::fmt::Debug {
    println!("{:?}", trt)
}

这段代码很好。它定义了一个特征和一个结构。该结构实现了特征;这需要实现一个功能。到目前为止一切都很好。但是,如果我尝试以下代码:

trait MyTrait {
    fn get_value() -> &'static str;
}

#[derive(Debug)]
struct MyStruct;

impl MyTrait for MyStruct {
    fn get_value() -> &'static str {
        "has value"
    }
}


fn main() {
    println!("My value: {}", MyStruct::get_value());
    has_trait(MyStruct);
}

fn has_trait<T>(trt: T) where T: MyTrait + std::fmt::Debug {
    println!("{:?}", trt::get_value())
}

我收到以下错误:

error[E0433]: failed to resolve: use of undeclared type or module `trt`
  --> src/main.rs:21:22
   |
21 |     println!("{:?}", trt::get_value())
   |                      ^^^ use of undeclared type or module `trt`

现在,我不太明白为什么那行不通。trt应该代表一个副本myStruct然后它应该有自己的功能吧?

有趣的是,以下代码将编译:

trait MyTrait {
    fn get_value(&self) -> &'static str;
}

#[derive(Debug)]
struct MyStruct;

impl MyTrait for MyStruct {
    fn get_value(&self) -> &'static str {
        "has value"
    }
}


fn main() {
    println!("My value: {}", MyStruct.get_value());
    has_trait(MyStruct);
}

fn has_trait<T>(trt: T) where T: MyTrait + std::fmt::Debug {
    println!("{:?}", trt.get_value())
}

那么无法编译的代码到底有什么问题呢?

标签: rust

解决方案


现在,我不太明白为什么那行不通。trt应该代表一个副本MyStruct然后它应该有自己的功能吧?

对于 Rust 中的关联函数,它并不完全适用。使用标识符trt,您可以调用接收者所在的方法(或其变体之一,例如or )。但是,没有接收器,所以它是一个关联函数。这类似于某些语言(如 Java)中的静态方法。与 Java 不同,Rust 中的关联函数只能通过使用该函数指定类型或类型参数来调用:trtself&self&mut selfget_value()

fn has_trait<T>(trt: T) where T: MyTrait + std::fmt::Debug {
    println!("{:?}", T::get_value())
}

这现在可以工作了,甚至不需要 parameter trt,因为我们只是调用 type 的关联函数T,而不是方法。尽管在此上下文中是函数参数的标识符,但编译器实际上会在与令牌trt结合后尝试将其解释为其他内容(模块名称,类型名称,...) ,因此会出现给定的错误消息。::


推荐阅读