&'static str; } #[derive(Debug)] struct MyStru-6ren">
gpt4 book ai didi

rust - 为什么在调用结构函数时会出现 "use of undeclared type or module"错误?

转载 作者:行者123 更新时间:2023-11-29 08:29:07 25 4
gpt4 key购买 nike

我在 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())
}

那么无法编译的代码究竟有什么问题呢?

最佳答案

Now, I don't really understand very well why that wouldn't work. trt should represent a copy of MyStruct and then it should have its own functions, right?

对于 Rust 中的相关函数来说,它并不是那么有效。使用标识符 trt,您可以调用 methods,其中 trt 是接收者(self 或其变体之一,例如如 &self&mut self)。但是,get_value() 没有接收者,因此它是一个关联函数。这类似于某些语言(例如 Java)中的静态方法。与 Java 不同,Rust 中的关联函数只能通过指定函数的类型或类型参数来调用:

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

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

关于rust - 为什么在调用结构函数时会出现 "use of undeclared type or module"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55329386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com