创建一个静态const Vec <String>

sim*_*mao 11 rust

我正在尝试初始化Vec<String>一些可以在我的代码上重用的设置.

我正在使用,const left: Vec<String> = vec![...但这不起作用:

error[E0308]: mismatched types
  --> names-generator.rs:2:27
   |
2  | const left: Vec<String> = vec![
   |                           ^ expected slice, found array of 93 elements
   |
   = note: expected type `Box<[std::string::String]>`
   = note:    found type `Box<[&str; 93]>`
   = note: this error originates in a macro outside of the current crate
Run Code Online (Sandbox Code Playgroud)

做这样的事情的推荐方法是什么?

更新:我不知道这是如何标记为重复.这两个相关的问题是无关的.

gle*_*ebm 13

你想让它变得可变吗?如果没有,您可以使用数组,例如:

const LEFT: [&'static str; 3] = ["Hello", "World", "!"];
// or
const LEFT: &'static [&'static str] = &["Hello", "World", "!"];
Run Code Online (Sandbox Code Playgroud)

Strings基本上被复制到任何地方使用,因此第二种形式可能更好,具体取决于数组的大小.

  • 第一个是对静态字符串的3个引用的数组,第二个是对静态字符串的静态引用数组的引用.这里的静态意味着程序的生命周期=生命周期,因此有效地存储在可执行文件的DATA部分中.我看到该数组有93个元素:93个64位指针比CPU缓存行小,所以第一个签名实际上可能更快,绝对值得基准测试. (3认同)
  • @glebm 不正确。CPU 缓存行(在典型的台式机和移动 CPU 上)为 64 字节。93 个 64 位指针总共占用 744 个字节,即 12 个缓存行。 (3认同)
  • @BrennanVincent 是绝对正确的。另外,每个切片实际上是一个指针+长度,因此每个切片有 16 个字节。 (2认同)