gpt4 book ai didi

rust - 何时对类字符串类型使用 AsRef 或其他转换特征

转载 作者:行者123 更新时间:2023-11-29 07:42:28 25 4
gpt4 key购买 nike

我在 Rust stable(截至目前,版本 1.2)中定义了一个 crate API,并且对定义我自己的类字符串类型的最佳实践感到困惑。

例如,我有一个包装字符串的 Foo 类型。

pub struct Foo(String);

我的 API 隐藏了 Foo 实例的构造,此外,因为元组字段是私有(private)的,所以应用程序不会错误地为自己构造一个无效的 Foo 值。这意味着我的 API 限制应用程序只能使用有效的 Foo 值。到目前为止一切顺利。

但是,我希望应用程序能够像使用字符串一样使用 Foo 实例——比如说,打印它、记录它、将它写入文件、将它传递给第三方——接受 &str 的 party crate,通过 to_string() 构造副本并改变副本等。简而言之,我希望应用程序能够“抛弃”Foo-ness 并使用对底层字符串的引用。因为应用程序无法将原始字符串转换回 Foo 实例,所以保留了类型安全。

我的问题是:如果有的话,我的 crate 应该为 Foo 实现什么样的转换特征,以允许应用程序“抛弃”Foo-ness 并使用底层字符串作为原始字符串?将 Foo 转换为 &str 很重要,这样可以避免对底层字符串进行任何不必要的复制。

比如,怎么样?

impl AsRef<str> for Foo

这样做对吗?足够地道了吗?我应该考虑为 Foo 实现任何其他转换特征吗?

最佳答案

如果 Foo 在语义上是一个字符串,然后实现 Deref<Target = str> (或者可能是 Deref<Target = String>DerefMut )是主要的事情。这将允许 &Foo强制&str , 所以你可以写类似 &*foo 的东西得到 &str从一个Foo , 和 foo.starts_with("bar")等等,调用在 str 上定义的方法.

实现 AsRef也会对某些事情有益。 Borrow是您可能想要的另一件事,though there are things to consider before doing so .

关于rust - 何时对类字符串类型使用 AsRef 或其他转换特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32556714/

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