如何从函数返回固定大小的字符串文字数组?

时间:2018-10-28 14:44:30

标签: arrays string rust

此功能适用于i32类型,但适用于str类型:

fn getValues() -> [str; 2] {
    [
        "37107287533902102798797998220837590246510135740250",
        "46376937677490009712648124896970078050417018260538",
    ]
}

我得到了错误:

  
error[E0277]: the size for values of type `str` cannot be known at compilation time
 --> src/lib.rs:1:1
  |
1 | / fn getValues() -> [str; 2] {
2 | |     [
3 | |         "37107287533902102798797998220837590246510135740250",
4 | |         "46376937677490009712648124896970078050417018260538",
5 | |     ]
6 | | }
  | |_^ doesn't have a size known at compile-time
  |
  = help: the trait `std::marker::Sized` is not implemented for `str`
  = note: to learn more, visit <https://doc.rust-lang.org/book/second-edition/ch19-04-advanced-types.html#dynamically-sized-types-and-the-sized-trait>
  = note: slice and array elements must have `Sized` type

此错误使我认为我需要添加大小,但是我确实做到了:大小为2。Rust想要什么?

2 个答案:

答案 0 :(得分:4)

strthe str primitive type,它是unsized type,有一些限制-您遇到了其中之一。

要解决您的问题,您需要返回一个借来的字符串切片str,而不是返回普通的&str。在这种特定情况下,您甚至可以使用&'static str,因为字符串文字始终具有static的生存期。

此外,由于基本数组也是DST(动态调整大小类型,另一种用于调整非调整大小类型的大小),因此需要指定元素数量(正确完成操作)。

因此,完整的声明将为fn getValues()-> [&'static str; 100]

如果在编译时不知道数组的大小,则可能要使用Vec,如果您有一些非文字字符串,则可能要使用String。看起来像

fn getValues() -> Vec<String> { vec!["shoten".into()] }

P.S .:不要回避那些由堆分配的,拥有的类型,它们确实使编程更容易。与参考文献和生命周期抗争是一种很好的方式,但是您不必先做所有的事情,而在以后进行优化和重构。

答案 1 :(得分:2)

这是说str没有固定的大小,不是数组没有固定的大小。您不能拥有类型为str的值,只能将它们放在某种指针后面。

使用[&'static str; 100]