在Rust中返回不可变字符串

时间:2014-09-17 17:57:14

标签: string rust

我正在寻找从Rust中的函数返回一个字符串,但我现在看到的唯一选项是返回String,可以修改它。虽然它不是不正确的,但我非常喜欢将错误描述之类的字符串作为不可变的返回。

那么有没有办法让当前返回的函数Result<Something, String>实际将错误返回为不可变的?是否可以在类型本身中强制执行它,同时仍然返回Str - 兼容的东西?或者我应该停止担心并始终回馈String? (像大多数std::io函数一样)

1 个答案:

答案 0 :(得分:8)

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() }
}

由于编译器优化,这是一个零成本的包装器,并且两个方法都被内联,但由于这些方法是与结构内部交互的唯一方法,并且它们只返回不可变引用,因此这种结构的值将是实际上是不可改变的。

但是,我认为你真的不需要这一切。所有权和借用的Rust概念消除了您通常使用C或C ++或Java等语言中的可变数据所带来的所有问题,所以只需要自然 - 如果您要返回String,则放弃所有控制它,让呼叫者决定他们想用它做什么,不需要任何限制。