rust - 为什么在调用结构的函数时会出现“使用未声明的类型或模块”错误?
问题描述
我在 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())
}
那么无法编译的代码到底有什么问题呢?
解决方案
现在,我不太明白为什么那行不通。
trt
应该代表一个副本MyStruct
然后它应该有自己的功能吧?
对于 Rust 中的关联函数,它并不完全适用。使用标识符trt
,您可以调用接收者所在的方法(或其变体之一,例如or )。但是,没有接收器,所以它是一个关联函数。这类似于某些语言(如 Java)中的静态方法。与 Java 不同,Rust 中的关联函数只能通过使用该函数指定类型或类型参数来调用:trt
self
&self
&mut self
get_value()
fn has_trait<T>(trt: T) where T: MyTrait + std::fmt::Debug {
println!("{:?}", T::get_value())
}
这现在可以工作了,甚至不需要 parameter trt
,因为我们只是调用 type 的关联函数T
,而不是方法。尽管在此上下文中是函数参数的标识符,但编译器实际上会在与令牌trt
结合后尝试将其解释为其他内容(模块名称,类型名称,...) ,因此会出现给定的错误消息。::
推荐阅读
- python - 熊猫爆炸与非列表列
- node.js - Node.js API 由 Keycloak 保护,访问类型为“仅承载”
- python-3.x - Zeep 客户端服务请求缺少元素
- html - 我切换到 Visual Studio 代码,我面临这个问题
- db2 - DB2 - 查找视图列的源表
- asp.net-mvc - ASP .NET Core Identity - 如何更新用户的单个详细信息?
- python - 在 scapy 中,如何从 TacacsAuthorizationRequest 中的 fields_desc 列表中获取相应的 ByteEnumField 值?
- arrays - 尝试将具有另一个对象数组的对象数组从 vu 发送到 laravel 控制器
- python - Python:ValueError:不能同时执行聚合和转换操作
- function - Julia中一维随机游走的阶梯函数