此功能适用于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想要什么?
答案 0 :(得分:4)
str
是the 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]
。