gpt4 book ai didi

generics - 编写 ?Sized by itself 作为特征界限是一种惯例吗?

转载 作者:行者123 更新时间:2023-11-29 08:04:34 25 4
gpt4 key购买 nike

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是自己写的,其余的trait bounds在不同的行?这是约定吗?据我了解,以上内容实际上与以下内容相同?

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?您可以在 page 295 上的类似示例中看到这一点,

...
where T: AsRef<U>
T: ?Sized, U: ?Sized
...

最佳答案

这是纯粹的惯例,并不是一成不变的,但它确实有一些优点。

特殊语法 ?Sized 允许编译器在不合适时(单态化时)删除此绑定(bind)。因此,在某种程度上,将其拆分并放在通用定义中而不是 where 子句中是有道理的,以便于阅读,并且与其他事实不同,它不是不是一个严格、死板的标记。

有些库甚至更进一步,列出了通用定义中的所有标记,以及 where 子句中的所有特征。

如评论中所述以及@PeterHall 通过提交日志发现的那样,在 rust 1.15 之前,?Sized 仅作为类型定义中的特征要求提供。 This PR将此更改为我们今天的行为。

关于generics - 编写 ?Sized by itself 作为特征界限是一种惯例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58026832/

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