gpt4 book ai didi

rust - Rust中的每个泛型是否都必须实现某些特征才能拥有 'methods'?

转载 作者:行者123 更新时间:2023-12-03 11:41:14 25 4
gpt4 key购买 nike

我无法控制下面的AB,它们来自库。两者都实现了hello方法,并且我想创建一个对两者都起作用的函数,但是我不想重复使用代码。在C++上,它不检查模板参数是否实现任何方法,而只是检查实例化中的类型是否实现该方法。看一看:

pub struct A {
x: u8,
}

impl A {
pub fn new() -> A {
A { x: 0 }
}
pub fn hello() {
println!("hello")
}
}

pub struct B {
x: u8,
}

impl B {
pub fn new() -> B {
B { x: 1 }
}
pub fn hello() {
println!("hello")
}
}

pub fn say_hello<T>() {
let t: T = T::new();
t.hello();
}

fn main() {
say_hello::<A>();
say_hello::<B>();
}

这不会编译,因为它说 T没有 say_hello方法。由于这是来自图书馆的,因此我无法为他们实现特征。所以我在这里无能为力吗?我必须重复代码吗?

请注意,可以在编译时知道实例化类型 AB是否都具有 hello方法。 C++不在乎。

最佳答案

TLDR:是的。
C++的模板确实与泛型类型不同(尤其是在Rust中)。第一个通过替换工作,而无需在项目定义时深入研究类型,但是在使用时仅使用。因此,我相信在C++中,可以创建一个模板项目,该项目同时可以编译,并且由于需求冲突而无法实例化。
Rust中的泛型类型不是这种情况,您在定义泛型项目时会对其进行检查,例如T中的fn f<T>(..) {..}。因此,编译器会分析T类型及其实例的所有用法,以便正确使用它们。
所以总的来说,是的,您需要具有一个使用类型的方法的特征。对于您的情况,这可能是首选的解决方案:

trait Hello {
fn say_hello();
}

impl Hello for A {
fn say_hello() {
A::hello()
}
}

impl Hello for B {
fn say_hello() {
B::hello()
}
}
如果您希望具有类似于C++中模板的行为,则可以看看macros:
macro_rules! say_hello {
($t:ty) => {{
<$t>::hello()
}}
}

fn main() {
say_hello!(A);
say_hello!(B);
}

关于rust - Rust中的每个泛型是否都必须实现某些特征才能拥有 'methods'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62481961/

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