- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 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/
我正在使用std::fs中的函数,这些函数带有path: impl AsRef之类的参数。我希望使自己的函数具有多态性,以便它们也可以采用任何impl AsRef而不是仅接受&str。但是,所讨论的类
如果我有一个包含这样的引用的结构: struct Struct { reference: &'a str } 如何为 Struct 实现 AsRef?我试过这个: impl AsRef> fo
我需要创建用于与 FFI 接口(interface)的 NewType 包装器。我想创建一个类似于 Rust 的 String 和 str 类型的接口(interface),所以我可以有一个拥有类型的
我有一个围绕 &str 的包装器来保持不变量。当我尝试返回一个新的包装器时,该包装器基本上将参数包装的相同数据包装到函数中( playground ),我收到“无法返回引用函数参数 s 的值” str
playground use std::path::Path; // fn f1(p: AsRef) { // println!("{}", p.as_ref().display()); //
我很难理解如何在下面的代码中使用生命周期。我知道明确的生命周期对于帮助编译器理解它何时可以保存/释放数据是必要的,但在这种特殊情况下, url.serialize() 生成一个匿名字符串,我不太确定如
我很难获得 AsRef以干净的方式工作。 const DEFAULT: &str = "lib"; use std::path::{Path, PathBuf}; fn extend(p: &Path
我正在尝试编写一个连接两个可迭代对象的函数,这两个可迭代对象的项目可以转换为 OsStr 引用,并且在尝试指定引用的生命周期时遇到了巨大的困难。 use std::convert::AsRef; us
以下代码显示了问题的来源。自 as_slice()已弃用,as_ref()建议作为替代品。 但是,在这种情况下使用它时,需要类型注释。 let s = "Hi"; // Thi
我在 Rust stable(截至目前,版本 1.2)中定义了一个 crate API,并且对定义我自己的类字符串类型的最佳实践感到困惑。 例如,我有一个包装字符串的 Foo 类型。 pub stru
这是我在我的 Rust 版本中看到的实现: #[stable(feature = "rust1", since = "1.0.0")] impl AsRef for PathBuf { #[i
我想写一个可以直接接受字符串切片的特征: use std::path::Path; trait Trait1 {} impl Trait1 for str {} // impl Trait1 for
Rust String 同时实现了 AsRef和 AsRef 但为什么 Rust 正确地允许 String 被借用为 &str 而不是 &[u8] 即使我们提供了显式类型注释提示? let s = S
AsRef 文档写道 Used to do a cheap reference-to-reference conversion. 我理解 reference-to-reference 部分 cheap
AsRef 有糖分吗?最好在稳定版。 我经常使用 as ref 声明类似字符串的参数,以便更轻松地与各种字符串(String、&str、&String 等)互操作: fn Fun>(my: S) {
AsRef 有糖分吗?最好在稳定版。 我经常使用 as ref 声明类似字符串的参数,以便更轻松地与各种字符串(String、&str、&String 等)互操作: fn Fun>(my: S) {
此代码无法编译: fn ref_on_int(_: T) where T: AsRef {} fn main() { ref_on_int(&0_i32) } 因为 the trait bou
我正在调用一个接受&[&str] 的函数。由于编写 ["aa", "bb"] 更方便,而不是 &["aa", "bb"],我决定添加 作为引用: struct Builder { s: Opt
我有一个将一些功能包装在切片周围的结构: use std::fmt::Debug; struct SliceWrapper { slice: &'a [T], pos: usize,
我有一个函数需要 AsRef作为参数,看起来像这样 fn test>(path: P) { path.join("13123123"); } 当我编译它时,它给了我以下错误 error[E05
我是一名优秀的程序员,十分优秀!