gpt4 book ai didi

generics - 从 Rust 中的泛型结构内部调用 T::new()

转载 作者:行者123 更新时间:2023-12-02 16:15:31 26 4
gpt4 key购买 nike

住手!我是一个 Rust 新手,在过去的几天里我与一堆东西作斗争,但找不到任何关于这方面的信息。我有一个通用结构(我已对其进行简化以说明问题)。我希望能够创建一个结构,用 std::collections::HashMap 、 HashSet 、 List 等做一堆事情我假设我需要暗示 T 必须实现一个新方法.. 使用特征?或类似的,但搜索只是找到基本的东西

public struct dude< T > {
data : std::sync::Arc< T >,
}

impl < T > dude< T > {
pub fn new() -> dude< T > {
Reloader{ data : Arc::new( <T>::new() ) }
}
}

产生以下错误:

<T>::new();
^^^ function or associated item not found in `T`

最佳答案

当您在 Rust 中的泛型上使用函数时,您需要指定提供这些函数的特征边界。

例如,如果我试图用一个不提供 new 函数的类调用 Dude::new() 会怎样?在某些语言(如 C++)中,这会在您尝试实际创建实例时被标记为错误 - 但在 Rust 中,存在推理局部性原则。

有一个现有的特性可以提供像 new() 这样的功能 - Default - 它提供了 Default::default() 使用它作为一个 trait bound 看起来像这样:

use std::sync::Arc;
pub struct Dude<T> {
data : std::sync::Arc<T>,
}

impl<T:Default> Dude<T> {
pub fn new() -> Dude<T> {
Dude{ data : Arc::new( Default::default() ) }
}
}

Default trait 已经为许多类型实现,对于任何自定义类型,您都可以轻松地派生它(并且 clippy 甚至会警告您在很多地方没有实现它)。

现在我可以写:

let dude: Dude<String> = Dude::new();

Dude 实现这个可能也很有意义,而不是在 Dude 本身内部提供新的。

impl<T:Default> Default for Dude<T> {
fn default() -> Dude<T> {
Dude{ data : Arc::new( Default::default() ) }
}
}

关于generics - 从 Rust 中的泛型结构内部调用 T::new(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66847372/

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