繁体   English   中英

在Rust中返回不可变字符串

[英]Return immutable string in Rust

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

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

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 ,你就放弃了对它的所有控制,所以让来电者决定他们想用它做什么,不需要任何限制。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM