【问题标题】:How do I return a fixed size array of string literals from a function?如何从函数返回固定大小的字符串文字数组?
【发布时间】:2018-10-28 14:44:30
【问题描述】:

此函数适用于类型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 想要什么?

【问题讨论】:

    标签: arrays string rust


    【解决方案1】:

    strthe str primitive type,这是一个unsized type,有一些限制——你遇到了其中一个。

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

    此外,由于原始数组也是 DST(动态调整大小的类型,另一种调整未调整大小类型的方法),因此您需要指定元素的数量(您做得正确)。

    所以,完整的声明是fn getValues()-&gt; [&amp;'static str; 100]

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

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

    P.S.:不要回避那些堆分配的、拥有的类型——它们确实使编程更容易。与引用和生命周期斗争是一种很好的方式,但您不需要预先做所有这些,而是​​在以后进行优化和重构。

    【讨论】:

    • 工作正常。如果字符串文字总是具有静态生命周期,为什么我需要放置静态,我有点困惑。
    • 生命周期是类型的一部分,在 rust 中的函数签名需要完全指定类型。这是一种叫做lifetime elision 的东西,它简化了 specific 情况,但 Rust 很少使用这种推导的属性。在这种情况下,省略不适用,因为输入参数没有生命周期使用(因为没有)。
    • @camccar 没有重复的说这个答案的等价物。
    • 我没有看到任何地方都说以静态为前缀。
    【解决方案2】:

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

    使用[&amp;'static str; 100]

    【讨论】:

    • Curios,为什么我不能有 str 类型的值?
    • @camccar 这是因为 str 类型没有大小。因此,无法计算其大小以在堆栈上预分配内存。另一方面,引用确实有大小(它基本上只是一个指针)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    相关资源
    最近更新 更多