簡體   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