【问题标题】:How can I create a static String in Rust? [duplicate]如何在 Rust 中创建静态字符串? [复制]
【发布时间】:2019-09-22 10:17:30
【问题描述】:

有没有办法在 Rust 中创建静态字符串?

我试过了:

static somestring: String = String::new();

但我得到了这个错误:

error: `std::string::String::new` is not yet stable as a const fn
 --> src/main.rs:2:29
  |
2 | static somestring: String = String::new();
  |

How to create a static string at compile time 不能解决我的问题,因为它是关于 &'static str,而不是 String。我需要String 可以全局寻址。

【问题讨论】:

  • 考虑到它是static,您可以将其设为静态字符串切片(&'static str),而不是分配给String 的堆。另见stackoverflow.com/q/32956050/1233251stackoverflow.com/q/27791532/1233251
  • 对于static String 是(或将会是)什么可能存在误解。 static 是全局可寻址的(也可以在任何地方看到,包括来自其他库的对象)。 'static(注意')表示可以跨越整个程序生命周期的生命周期;任何static 都有一个生命周期'static。根据定义,String 是一个堆分配的结构,它拥有str,但也可以扩展大小(通过重新分配)。 static String 为此没有多大意义。您可能想要'static String,请参阅其他评论
  • 作为对原始问题的评论,将此问题标记为单例模式的副本感觉很苛刻。两个答案相同的问题不是同一个问题。特别是在这种情况下,当涉及到字符串时,这些字符串是拥有的和可变的,并且具有与 &'static str 不同的处理方式。

标签: string rust


【解决方案1】:

不要将String 类型与str 类型混淆。

What are the differences between Rust's `String` and `str`?

字符串是可变的并且总是堆分配的。

str,通常表示为 &str 是不可变的,只是一个字符串的视图。

您的问题似乎混淆了静态全局可寻址的概念。您可以将 (&'static str) 称为具有 'static 生命周期的字符串。具有 'static 生命周期的字符串很常见,因为它们(主要)代表程序中的硬编码字符串。 'static 生命周期意味着对象(在本例中为字符串)将一直存在到程序结束。大多数'静态对象在编译时是已知的。这应该很自然地考虑,因为硬编码的字符串在编译时是已知的。这些字符串不能变异。

另一方面,字符串是可变的。你可以从 &'static str 创建一个字符串。

鉴于问题中缺少上下文,如果您想要的是一个全局可寻址的字符串并想要定义它静态我可能会建议使用宏lazy-static:

https://crates.io/crates/lazy_static

正如 mcarton 所建议的那样,这个问题似乎可以归结为单例模式。你可以在这里了解更多关于它在 Rust 中的实现:How do I create a global, mutable singleton?

【讨论】:

    猜你喜欢
    • 2016-05-11
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多