如何在Rust中创建静态字符串?

8

有没有办法在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();
  |

如何在编译时创建静态字符串并不能解决我的问题,因为它涉及到的是&'static str,而不是String。我需要使String全局可访问。


1
考虑到它是 static,你可以将其作为静态字符串切片 (&'static str),而不是堆分配的 String。另请参见 https://dev59.com/3lwY5IYBdhLWcg3wJU54 和 https://dev59.com/4V4c5IYBdhLWcg3wjq7R。 - E net4
3
可能有人对static String的理解存在误解。 static表示可以全局访问(即可以在任何地方看到,包括其他库中的对象)。 'static(请注意引号)表示寿命可以跨越整个程序的生命周期;任何static都具有生命周期'static。 根据定义,String是一个堆分配的结构,它保存了str但也可以通过重新分配来扩展大小。 因此,static String没有太多意义。 您可能需要一个'static String,请查看另一条评论。 - user2722968
3
作为对原问题的评论,将此问题标记为单例模式的副本似乎有些苛刻。两个具有相同答案的问题并不是同一个问题。特别是在涉及字符串(具有所有权和可变性),与 &'static str 不同处理的情况下。 - Josep
1个回答

7
不要混淆String类型和str类型。 Rust的`String`和`str`有什么区别? String可变且始终在堆上分配。
通常表示为&str的str不可变,只是对字符串的视图。
你的问题似乎混淆了“静态”和“全局可寻址”的概念。您可以将(&'static str)称为具有'静态lifetime'的字符串。带有 '静态lifetime' 的字符串很常见,因为它们(大多数情况下)代表程序中的硬编码字符串。'静态lifetime' 意味着在程序结束之前该对象(在本例中为字符串)将一直存在。大多数 静态 对象在编译时就已知。这应该很自然地想到,因为硬编码字符串在编译时就已知。这些字符串无法改变。
另一方面,字符串是可变的。您可以从&'static str创建一个String。
鉴于问题缺乏上下文,如果您想要一个具有全局可寻址性并想要将其定义为 static ,我建议使用 lazy-static 宏: https://crates.io/crates/lazy_static 正如mcarton所建议的那样,这个问题似乎归结为单例模式。您可以在此处了解有关其在Rust中的实现的更多信息: 如何创建全局的可变单例?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接