Как я могу добавить char или & str к String без предварительного преобразования его в String? - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь написать лексер для забавы, но что-то продолжает беспокоить меня.

let mut chars: Vec<char> = Vec::new();
let mut contents = String::new();
let mut tokens: Vec<&String> = Vec::new();
let mut append = String::new();
//--snip--
for _char in chars {
    append += &_char.to_string();
    append = append.trim().to_string();

    if append.contains("print") {
        println!("print found at: \n{}", append);
        append = "".to_string();
    }
}

Каждый раз, когда я хочу сделать что-то столь же простое, как добавить &str к String, у меня естьконвертировать его, используя .to_string, String::from(), .to_owned и т. д.

Есть ли что-то, что я делаю неправильно, чтобы мне не приходилось постоянно это делать, или это основной способ?добавления?

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Важно понимать различия между String и &str, и почему различные методы принимают и возвращают каждый из них.

A &str или &mut str обычно предпочтительнее варгументы функции и возвращаемые типы.Это потому, что они являются просто указателями на данные, поэтому при их передаче ничего не нужно копировать или перемещать.

A String возвращается, когда функции необходимо выполнить какое-то новое распределение, тогда как &str и &mut str - это кусочки существующего String.Даже если &mut str является изменяемым, вы не можете изменить его таким образом, чтобы увеличить его длину, потому что это потребовало бы дополнительного выделения.

Функция trim может возвращать срез &str, потому что этоне требует изменения исходной строки - обрезанная строка - это просто подстрока, которую идеально описывает срез.Но иногда это невозможно;например, функция, добавляющая строку с дополнительным символом, должна будет вернуть String, поскольку она будет выделять новую память.


Вы можете уменьшить количествовведите преобразования в ваш код, выбрав различные методы:

for c in chars {
    append.push(c); // append += &_char.to_string();
    append = append.trim().to_string();

    if append.contains("print") {
        println!("print found at: \n{}", append);
        append.clear(); // append = "".to_string();
    }
}

Нет ничего похожего на trim_in_place метод для String, поэтому способ, которым вы это сделали, вероятно, единственный.

0 голосов
/ 26 ноября 2018

Если вы пытаетесь что-то сделать с типом, проверьте документацию.Из документации для String:

  • push: "Добавляет указанный char в конец этого String."
  • push_str: "Добавляет указанный фрагмент строки в конец этого String."
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...