Соберите в свой собственный vec собственных строк в ржавчине

Я пытаюсь собрать в vec строк ржавчины с помощью следующего:

let fields : ~[~str] = row.split_str(",").collect();

Я получаю следующую ошибку: ожидается std:: iter:: FromIterator<& str>, но обнаружен std:: iter:: FromIterator<~ str> (хранилище str отличается: ожидается & но нашел ~)

Я пытался использовать подсказки типа, но безуспешно

1 ответ

Решение

.split_str возвращает итератор &str срезы, то есть он возвращает подпредставления row данные. Одолженный &str не принадлежит ~str: чтобы сделать эту работу, либо собрать в ~[&str] или скопируйте каждый &str в ~str перед сбором:

let first: ~[&str] = row.split_str(",").collect();
let second: ~[~str] = row.split_str(",").map(|s| s.to_owned()).collect();

FWIW, если вы разделяете на односимвольный предикат, то split будет более эффективным, (например, row.split(',') в этом случае).

Кроме того, я рекомендую вам перейти на более свежую версию Rust, 0.11 была недавно выпущена, но ночные программы рекомендуются для установки (измените 0.10 в 0.11 или же master в приведенной выше документации ссылки на соответствующие документы).

Ночью два фрагмента выше были бы записаны как:

let first: Vec<&str> = row.split(',').collect();
let second: Vec<String> = row.split(',').map(|s| s.to_string()).collect();

(Наконец, если вы боретесь с различием &str против ~str ака String Я написал некоторые детали некоторое время назад.)

Другие вопросы по тегам