rust - Rust 和 trait 边界约定 (?Sized)
问题描述
在Programming Rust的第 297 页上,您可以找到以下内容
impl HashMap<K, V> where K: Eq + Hash
{
fn get<Q: ?Sized>(&self, key: &Q) -> Option<&V>
where K: Borrow<Q>,
Q: Eq + Hash
}
我之前看过这个,?Sized
它自己写在哪里,其余的特征界限在不同的线上?这是一个约定吗?据我了解,以上内容实际上与以下内容相同吗?
impl HashMap<K, V> where K: Eq + Hash
{
fn get<Q>(&self, key: &Q) -> Option<&V>
where K: Borrow<Q>,
Q: Eq + Hash + ?Sized
}
为什么会?Sized
分裂?您可以在第 295 页的类似示例中看到这一点,
...
where T: AsRef<U>
T: ?Sized, U: ?Sized
...
解决方案
那是纯粹的约定,它不是一成不变的,但它确实有一些优点。
?Sized
如果不合适(当单态化时),特殊语法允许编译器删除这个界限。因此,where
为了便于阅读,将其拆分并将其放入通用定义而不是从句中,并将它与其他的不同,它不是一个严格、严格的标记分开这一事实确实是有道理的。
那里的一些库走得更远,列出了通用定义中的所有标记,以及where
子句中的所有特征。
正如评论中所述并由@PeterHall 通过提交日志发现,在 rust 1.15 之前,?Sized
仅作为类型定义中的特征要求提供。此 PR将其更改为我们今天的行为。
推荐阅读
- batch-file - 如何使上下文菜单上的批处理脚本在 UNC 路径上工作?
- python - Python中的阴影模式测试
- mysql - 如何知道 MYSQL 中特定数据库的数据库大小?
- mysql - 如果列中重复值,则创建触发器阻止插入或更新
- django - 如何在管理面板中设置标志以标记激活的用户
- sql - SQL Server 以及如何将行转换为列
- asp.net-core - 如何使用 FormData 将文件和数据数组发送到 API 服务器
- c++ - OpenGL glDrawArraysInstanced 比 glDrawElementsInstanced 更快:有没有办法让 glDrawElementsInstanced 更快?
- r - OSM - XML 文件中的标签之间的迭代
- nginx - NGINX 反向代理失败并出现 404