我有一些代码:

impl<K, V> Database<K, V>
where
    K: Eq + Hash,
    V: Clone,

其中我有Database个定义如下:

pub struct Database<K, V>
where
    K: Eq + Hash,

请注意,V上没有性状界限.我的问题是,如果我构造这个对象的一个实例,使得V: !Clone?我依赖V: Clone的方法会不会简单地panic ?或者铁 rust 编译器会发现它吗?

推荐答案

你可以读到这个:

impl<K, V> Database<K, V>
where
    K: Eq + Hash,
    V: Clone,
{
    // methods
}

以下是:

只要K实现Eq + Hash,V实现Clone,就为Database<K, V>实现这些方法.

如果不满足这些约束,那么这些方法将不存在,并且如果您try 调用它们,您将看到编译错误.

这些约束与类型本身上的约束不同.如果您可以构造该类型的实例,则这些只会产生影响.实际上,省略对类型本身的所有约束并只在impl个块上使用它们是很常见的.

Rust相关问答推荐

无需通过ASIO输入音频,并使用cpal进行反馈示例

我如何在Rust中使用传递依赖中的特征?

MPSC频道在接收器处阻塞

为什么铁 rust S的默认排序功能比我对小数组的 Select 排序稍微慢一些?

从未排序的链表中删除重复项的铁 rust 代码在ELSE分支的低级上做了什么?

获取已知数量的输入

为什么特征默认没有调整大小?

从管道读取后重置标准输入

Sized问题的动态调度迭代器Rust

Rust中如何实现一个与Sized相反的负特性(Unsized)

max(ctz(x), ctz(y)) 有更快的算法吗?

如何在 Rust 的 Hyper 异步闭包中从外部范围正确读取字符串值

返回迭代器的特征

特征中定义的类型与一般定义的类型之间的区别

如何将切片推入数组?

TcpStream::connect - 匹配武器具有不兼容的类型

类型组的通用枚举

你能用 Rust 和 winapi 制作 Windows 桌面应用程序吗?

相互调用的递归异步函数:检测到循环

为什么 Bevy 的 Trait 边界不满足 Rapier 物理插件?