我正在考虑从Rust中的函数返回一个字符串,但是我现在看到的唯一选项是返回String
,它可以修改。虽然这不是不正确的,但我非常喜欢将一些字符串(如错误描述)返回为不可变的想法。
那么,当前返回的函数(例如Result<Something, String>
)有任何方法可以将错误作为不可变的返回吗?是否可以在类型本身中强制执行它,同时仍然返回Str
-compatible?还是我应该停止担心,总是把String
的东西还给我?(就像大多数std::io
函数一样)
发布于 2014-09-17 10:52:14
锈蚀采用了继承可变的概念--也就是说,给定的数据是否可变由该数据的所有者决定。因此,如果您的数据是一个常规的拥有结构,如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() }
}
由于编译器优化,这是一个零成本包装器,这两种方法都是内联的,但由于这些方法是与结构内部交互的唯一方法,而且它们只返回不变的引用,这种结构的值实际上是不可变的。
然而,我认为你并不需要所有这些。所有权和借用的生锈概念消除了C、C++或Java等语言中常见的可变数据的所有问题,所以要自然一些--如果您返回一个String
,您就放弃了对它的所有控制,所以让调用者决定他们想用它做什么,没有任何限制的必要。
https://stackoverflow.com/questions/25897288
复制