我正在寻找从Rust中的函数返回一个字符串,但我现在看到的唯一选择是返回String,可以修改.虽然它不是不正确的,但我非常喜欢将错误描述之类的字符串作为不可变的返回.
那么有没有办法让当前返回的函数Result<Something, String>实际上将错误实际返回为不可变的?是否可以在类型本身中强制执行它,同时仍然返回一些Str兼容的东西?或者我应该停止担心并且总是回馈Strings?(像大多数std::io功能一样)
Vla*_*eev 11
Rust使用了一个继承可变性的概念 - 也就是说,给定的数据是否可变是由这件作品的所有者决定的.因此,如果您的数据是一个常规拥有的结构,例如String,您返回后就无法影响其可变性.
但是,有一种解决方法.由于Rust是基于值的语言,具有某种类型的单个字段的结构的实例具有与该类型的值完全相同的表示,因此您可以为您的类型创建一个不直接公开其字段的包装器.提供一个getter,它返回对该字段的不可变引用:
struct ImmutableString(String);
impl ImmutableString {
#[inline]
fn get_ref(&self) -> &String { &self.0 }
// or, even better:
#[inline]
fn as_slice(&self) -> &str { self.0.as_slice() }
}
Run Code Online (Sandbox Code Playgroud)
由于编译器优化,这是一个零成本的包装器,并且两个方法都被内联,但由于这些方法是与结构内部交互的唯一方法,并且它们只返回不可变引用,因此这种结构的值将是有效的不可变的.
但是,我认为你并不真的需要这一切.所有权和借用的Rust概念消除了您在C或C++或Java等语言中使用可变数据时常常遇到的所有问题,所以只是很自然 - 如果你要回归String,你就放弃了对它的所有控制,所以让来电者决定他们想做什么,不需要任何限制.
| 归档时间: |
|
| 查看次数: |
1579 次 |
| 最近记录: |