我在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
,您可以调用trt
是接收器的方法(self
或其变体之一,如&self
或&mut self
)。但是,get_value()
没有接收器,所以它是一个相关的功能。这类似于某些语言(如Java)中的静态方法。与Java不同,Rust中的关联函数只能通过使用该函数指定type或type参数来调用:
fn has_trait<T>(trt: T) where T: MyTrait + std::fmt::Debug {
println!("{:?}", T::get_value())
}
现在这将起作用,甚至不需要参数trt
,因为我们只是调用T
类型的关联函数,而不是方法。虽然trt
是此上下文中函数参数的标识符,但编译器实际上会尝试将其解释为其他内容(模块名称,类型名称,...),一旦与::
令牌结合,因此给出错误消息。