Как мне принять Опцию <String>, обработать ее и вернуть Опцию <String>? - PullRequest
0 голосов
/ 12 октября 2018

Исходя из Python, у меня возникли проблемы с пониманием жизни.Я пытаюсь реализовать эту тривиальную функцию, чтобы вернуть Option<String>, но я не могу ее получить.Все, что я смог сделать до сих пор, это:

fn match_exception(exception: Option<String>) -> String {
    let piles = ["a", "b"];
    exception
        .unwrap_or("".to_string())
        .split(',')
        .map(|exc| exc.trim())
        .filter(|exc| piles.contains(exc))
        .next()
        .unwrap_or("")
        .to_string()
}

Это возвращает String (не говоря уже о том, что мне это кажется очень неуклюжим), но я надеялся, что он вернется в том же форматечто он вошел, Option<String>.

Если я удаляю все после вызова next, он возвращает Option<&str>, и если я перехожу и определяю ожидаемый тип возврата на Option<&str>, он жалуется на то, что у меня нетНе устанавливайте время жизни:

error[E0106]: missing lifetime specifier
 --> src/lib.rs:1:57
  |
1 | fn match_exception(exception: Option<String>) -> Option<&str> {
  |                                                         ^ expected lifetime parameter
  |
  = help: this function's return type contains a borrowed value with an elided lifetime, but the lifetime cannot be derived from the arguments
  = help: consider giving it an explicit bounded or 'static lifetime

Может кто-нибудь подтолкнуть меня в правильном направлении или объяснить это немного более простым способом?

1 Ответ

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

Если вы вернете Option<&str>, возвращенное значение &str должно указывать на то, что доступно после возврата функции.Поскольку вы передаете Option<String> в функцию, это значение не будет доступно после возврата функции.

Если вы преобразуете строковые фрагменты to_string, вы можете использовать следующее:

fn match_exception(exception: Option<String>) -> Option<String> {
    let piles = ["a", "b"];
    exception
        .unwrap_or("".to_string())
        .split(',')
        .map(|exc| exc.trim())
        .filter(|exc| piles.contains(exc))
        .map(|s| s.to_string())
        .next()
}

Обратите внимание, что |s| s.to_string() является относительно дорогим.

Что вы действительно можете сделать, это принять Option<&str> в первую очередь:

fn match_exception(exception: Option<&str>) -> Option<&str> {
    let piles = ["a", "b"];
    exception
        .unwrap_or("")
        .split(',')
        .map(|exc| exc.trim())
        .filter(|exc| piles.contains(exc))
        .next()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...