Как мне вернуть массив строковых литералов фиксированного размера из функции? - PullRequest
0 голосов
/ 28 октября 2018

Эта функция будет работать для типа 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 голосов
/ 28 октября 2018

str - это тип str примитива , который является нестандартным типом с некоторыми ограничениями - вы столкнулись с одним из них.

Чтобы решитьвместо того, чтобы возвращать простой str, вам нужно вернуть &str, зарезервированный фрагмент строки.В этом конкретном случае вы могли бы даже использовать &'static str, потому что строковые литералы всегда имеют время жизни static.

Кроме того, поскольку примитивный массив также является DST (тип с динамическим размером, другой способ измерения размера без размера)), вам нужно указать количество элементов (что вы сделали правильно).

Итак, полное объявление будет fn getValues()-> [&'static str; 100].

Если вы не знаете размер массиваво время компиляции вы можете использовать Vec, если у вас есть несколько не-литеральных строк, которые вы, вероятно, захотите использовать String.Это выглядело бы как

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

PS: не уклоняйтесь от этих выделенных кучей принадлежащих типов - они действительно облегчают программирование.Борьба со ссылками и временем жизни - это хороший стиль, но вам не нужно делать все это заранее, а вместо этого оптимизируйте и реорганизуйте позже.

0 голосов
/ 28 октября 2018

Он говорит, что str не имеет фиксированного размера, не то, что массив не имеет.Вы не можете иметь значения типа str, вы можете иметь их только за каким-то указателем.

Использовать [&'static str; 100].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...