перезапись строки при concat Vec ‹& str› элемента внутри цикла - ржавчина

Вот уже пару часов ломаю голову над этой проблемой. После прочтения главы о срезах в книге о ржавчине. Я пытался объединить строки внутри цикла.

fn append_words(times: u16){
    let mut final_word = String::new();
    let word: &str = "aahing ";
    for _ in 0..times {
        let tmp = format!("{}{}", &mut final_word[..], word);
        final_word.push_str(&tmp[..]);
        println!("{}", final_word);
    }
}

Вывод

aahing 
aahing aahing aahing 
aahing aahing aahing aahing aahing aahing aahing 

Это прекрасно работает.

Проблема возникает, когда вместо объединения &str, объявленного внутри функции, я пытаюсь использовать элемент из вектора

fn select_words(words: Vec<&str>, times: u16){
    let mut final_word = String::new();
    println!("{}", words[5]);
    for _ in 0..times {
        let tmp = format!("{}{}", &mut final_word[..], words[5]);
        final_word.push_str(&tmp[..]);
    }
    println!("{}", final_word);
}

Вывод

aahing
aahing

Вместо того, чтобы объединять и показывать что-то вроде первого вывода, строка перезаписывает его. Я думаю, что это так, потому что я начал с попытки объединить разные слова в Vec<&str>, но он перезаписывал их на каждой итерации.

Я нашел эти похожие вопросы (первый действительно полезен), но опять же, когда Vec<&str> не используется, он работает нормально. Как объединить строки? Добавление к строке внутри цикла for

Разве я не беру в расчет право собственности или что-то в этом роде?

Заранее спасибо, я пробираюсь через книгу ржавчины, так что я все еще ржавый нуб

Редактировать:

Я создаю вектор из файла, также так я вызываю функцию.

use structopt::StructOpt;
use structopt::clap;

#[derive(StructOpt)]
#[structopt(setting = clap::AppSettings::InferSubcommands)]
struct Cli {
    #[structopt(short = "f", long = "file",
                help="get words from specific file",
                default_value="./words.txt",
                parse(from_os_str))]
    file: std::path::PathBuf,
}

fn main() {
    let args = Cli::from_args();
    let words = std::fs::read_to_string(&args.file)
        .expect("could not read file");
    let word_list = words.split('\n');
    let words_vec: Vec<&str> = word_list.collect();
    select_words(words_vec, 3);
}

Файл имеет такой формат

a
aa
aaa
aah
aahed
aahing
aahs

Я думаю, что часть «построение вектора» работает нормально.


person bsantanad    schedule 29.07.2021    source источник
comment
Насколько я могу судить, ваш код выглядит нормально. Как вы звоните select_words, какое значение times вы передаете? Было бы полезно, если бы вы могли составить полный воспроизводимый пример.   -  person loganfsmyth    schedule 29.07.2021
comment
конечно :) позвольте мне загрузить и эту часть   -  person bsantanad    schedule 29.07.2021
comment
Этот пример на игровой площадке показывает, что select_words, похоже, работает как и ожидалось.   -  person kmdreko    schedule 29.07.2021
comment
@kmdreko, вы абсолютно правы, проблема была в построении векторной части, вектор оказался примерно таким ["a\r", "aa\r"], с символом \r, который испортил мой вывод, после его удаления все работает :). Извините за зря потраченное время   -  person bsantanad    schedule 29.07.2021


Ответы (1)


Обе функции работали нормально, как указано @kmdreko и @loganfsmyth, проблема заключалась в том, как я строил вектор.

После удаления каждого элемента \r в конце каждого элемента был скрытый символ. Все работает сейчас

Спасибо всем :)

PS: Надо было заранее сделать dos2unix.

person bsantanad    schedule 29.07.2021