我在Rust stable中定义了一个crate API(截至目前为1.2版),并且对于定义我自己的类似字符串的类型的最佳实践感到困惑.
例如,我有一个Foo包装字符串的类型.
pub struct Foo(String);
Run Code Online (Sandbox Code Playgroud)
我的API隐藏了Foo实例的构造,而且,因为元组字段是私有的,所以应用程序不能错误地Foo为自己构造无效值.这意味着我的API限制应用程序仅使用有效值Foo.到现在为止还挺好.
但是,我希望应用程序能够使用一个Foo实例,就好像它是一个字符串 - 说,打印它,记录它,将它写入文件,将其传递给接受的第三方包,&str通过构造副本to_string()和变异简而言之,我希望应用程序能够"抛弃" Foo-ness并使用对底层字符串的引用.由于应用程序无法将原始字符串转换回Foo实例,因此保留了类型安全性.
我的问题是:我的crate应该实现什么转换特性,Foo以允许应用程序"抛弃" Foo-ness并使用底层字符串作为原始字符串?Foo转换为&str非常重要,以避免对底层字符串进行任何不必要的复制.
例如,怎么样?
impl AsRef<str> for Foo
Run Code Online (Sandbox Code Playgroud)
这是正确的做法吗?是否足以成为惯用语?我应该考虑实施其他转换特性Foo吗?
Chr*_*gan 12
如果a Foo 在语义上是一个字符串,那么实现Deref<Target = str>(或可能Deref<Target = String>和DerefMut)是主要的事情.这将允许&Foo强迫来&str,所以你可以写东西喜欢&*foo得到一个&str出的Foo,并且foo.starts_with("bar")和这样的,要求被定义方法str.
实施AsRef也将对某些事情有益.Borrow是你可能想要的另一件事,尽管在这样做之前还有一些事情需要考虑.
| 归档时间: |
|
| 查看次数: |
1009 次 |
| 最近记录: |