gpt4 book ai didi

rust - 在 crate 的 API 中发布具体类型而不是 `impl trait` 有什么好处?

转载 作者:行者123 更新时间:2023-11-29 07:47:43 26 4
gpt4 key购买 nike

在修补 crate 时,我自己隐藏了内部迭代器类型,但作者说发布类型是一项功能,最佳实践是为公开的每个迭代器发布一个显式包装器结构应用程序接口(interface)。显然,Rust 标准库对其所有迭代器都这样做。

为什么要这样做?更具体地说,如果实现与 std::env::Args 兼容的类型,使用...的优缺点是什么?

// implement iterator compatible with std::env::Args
pub struct Args { // public
// pub(crate) ...
}

impl Iterator for Args {
// ...
}

pub fn args() -> Args {
// ...
// return Args
}

对比

// implement iterator compatible with std::env::Args
pub(crate) struct Args { // hidden (outside of crate)
// pub(crate) ...
}

impl Iterator for Args {
// ...
}

pub fn args() -> impl Iterator<Item = String> {
// ...
// return Args
}

最佳答案

从来没有一个真正的最佳实践。

返回具体类型的原因包括:

  1. 您目前不能声明 impl Trait 类型的变量,因此必须推断出任何此类用法。出于同样的原因,这些不能轻易地放在结构中。

  2. 您不能将固有方法添加到 impl Trait返回类型。例如, Chars as_str 方法。

  3. 作为trentcl points out , impl Trait不能有条件地实现特征。这对于迭代器适配器很重要,例如 Skip .

  4. 您声明“与 std::env::Args 兼容”,但这是 Args 的特征实现:

    impl Iterator for Args {}
    impl ExactSizeIterator for Args {}
    impl DoubleEndedIterator for Args {}
    impl Debug for Args {}

    您的界面不允许其中四个中的三个。例如,您的 API 的消费者不能再从后面迭代。您可以通过执行 impl Iterator<Item = String> + DoubleEndedIterator + ExactSizeIterator + Debug 来解决此问题,但在某些时候你实际上拥有自己的类型。如果您在现有迭代器上返回新类型,也可能会出现此问题,这就是为什么我想要更好的委托(delegate)语法。

另见 C-NEWTYPE-HIDE API 指南。

the Rust standard library does this for all of its iterators

标准库中的迭代器创建于impl Trait之前存在,所以他们别无选择。由于向后兼容,它们现在无法更改为不再返回具体类型。

关于rust - 在 crate 的 API 中发布具体类型而不是 `impl trait` 有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52079983/

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