【问题标题】:How do I convert from a char array [char; N] to a string slice &str?如何从 char 数组转换 [char; N] 到一个字符串切片 &str?
【发布时间】:2016-07-13 18:28:35
【问题描述】:

给定一个固定长度的char数组如:

let s: [char; 5] = ['h', 'e', 'l', 'l', 'o'];

如何获得&str

【问题讨论】:

  • 注意: [char; 5]是多余的;可以推断类型。
  • @Shepmaster:我把它放在那里是为了让问题更清楚:)
  • 为什么要创建这样的数组? "hello" 1000% 更简单、更有用。
  • @delnan:有时我想用编译时未知的字符创建一个,例如[c1, c2, c3].

标签: string char rust


【解决方案1】:

你不能没有分配,这意味着你最终会得到一个String

let s2: String = s.iter().collect();

问题在于 Rust 中的字符串不是chars 的集合,它们是 UTF-8,这是一种没有每个字符固定大小的编码。

例如,本例中的数组将占用 5 x 32 位,总共 20 个字节。字符串的数据总共需要 5 个字节(虽然也有 3 个指针大小的值,所以在这种情况下,整体 String 会占用更多内存)。


我们从数组开始并调用[]::iter,它产生&char 类型的值。然后我们使用Iterator::collectconvert the Iterator<Item = &char> into a String。这使用了迭代器的 size_hintpre-allocate space in the String,减少了额外分配的需要。

【讨论】:

  • vec! 是否有对应于 String 的宏?
  • @Rufflewind 我不确定我是否理解。你是说String::from("foo") 还是"foo".to_string()?在某些情况下,您还可以使用"foo".into()。你真的不需要宏来做任何事情。这些只是函数调用。我想你可以创建一个方法s,如果它们太长,它会调用其中一个......
  • 我的意思是str!['h', 'e', 'y']
  • @Rufflewind 为什么你想要那个而不是"hey"
  • 有时我想用编译时未知的字符创建一个,例如[c1, c2, c3].
【解决方案2】:

另一个我在上面没有看到的快速单行:

let whatever_char_array = ['h', 'e', 'l', 'l', 'o'];
let string_from_char_array = String::from_iter(whatever_char_array);

注意: 最近引入了此功能(迭代 array)。我试图寻找确切的 rustc 版本,但找不到...

【讨论】:

  • > 最近引入了此功能(遍历数组)。我尝试寻找确切的 rustc 版本,但找不到...std::array::IntoIter 是在 1.51 中引入的,而 impl<T, const N: usize> IntoIterator for [T; N] 是在 1.53 中引入的
【解决方案3】:

我会给你一个非常简单的功能解决方案,但它不是最好的。您可以学习一些基础知识:

let s: [char; 5] = ['h', 'e', 'l', 'l', 'o'];
let mut str = String::from("");
for x in &s {
    str.push(*x);
}
println!("{}", str);

如果你想保留签名,你可以在变量名前加下划线,但在这个简单的例子中没有必要。该程序首先创建一个空的可变String,以便您可以将元素(chars)添加到String。然后我们通过引用 s 数组对 for 进行循环。我们将每个元素添加到初始字符串。最后你可以返回你的字符串或者直接打印出来。

【讨论】:

  • 如果你想保留签名,可以加下划线——这不是在 Rust 变量名中使用下划线的习惯用法。前导下划线指示编译器故意不使用此变量,此处并非如此。
  • String::from(""); — 这不是创建空String 的惯用方式。请改用String::new
  • 此解决方案不如使用collect 的答案有效,因为collect 使用extend 其中pre-allocates space for all the characters
猜你喜欢
  • 2019-08-04
  • 1970-01-01
  • 2012-07-25
  • 2021-05-27
  • 2012-05-16
  • 2012-02-16
  • 2016-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多