Как преобразовать & str в ~ str в Rust?
Это для текущего 0.6 ржавчины, кстати, не уверен в точном фиксации.
Скажем, я хочу, чтобы для каждого по некоторым строкам, и мое закрытие принимает аргумент заимствованного строкового указателя (& str). Я хочу, чтобы мое закрытие добавляло свой аргумент к собственному вектору принадлежащих ему строк ~ [~ str] для возврата. Мое понимание ржавчины слабое, но я думаю, что строки - это особый случай, когда вы не можете разыгрывать их с * правильно? Как получить строки из & str в векторный метод push, который принимает значение ~ str?
Вот код, который не компилирует
fn read_all_lines() -> ~[~str] {
let mut result = ~[];
let reader = io::stdin();
let util = @reader as @io::ReaderUtil;
for util.each_line |line| {
result.push(line);
}
result
}
Он не компилируется, потому что он выводит тип результата как [& str] с тех пор, как я нажимаю на него. Не говоря уже о том, что его жизнь будет неправильной, так как я добавляю в нее более короткую переменную.
Я понимаю, что могу использовать ReadUtil read_line() метод, который возвращает ~ str. Но это всего лишь пример.
Итак, как мне получить принадлежащую строку из заимствованной строки? Или я полностью недопонимаю.
Ответы
Ответ 1
Вы должны вызывать метод traSlice trait, to_owned, как в:
fn read_all_lines() -> ~[~str] {
let mut result = ~[];
let reader = io::stdin();
let util = @reader as @io::ReaderUtil;
for util.each_line |line| {
result.push(line.to_owned());
}
result
}
Значения признаков StrSlice находятся здесь:
http://static.rust-lang.org/doc/core/str.html#trait-strslice
Ответ 2
Вы не можете.
Во-первых, он не работает семантически: a ~str
promises, которому владеет только одно. Но a &str
заимствован, так что происходит с местом, которое вы заимствовали? Он не знает, что вы пытаетесь украсть его единственную ссылку, и было бы довольно грубо избивать данные вызывающего абонента из-под него, кроме того.
В противном случае он не работает логически: ~
-pointers и @
-pointers выделяются в совершенно разных кучах, а &
не знает, какая куча, поэтому она не может быть преобразована до ~
и по-прежнему гарантировать, что базовые данные будут находиться в нужном месте.
Итак, вы можете использовать read_line
или сделать копию, которая я... не совсем уверен, как это сделать:)
Я действительно задаюсь вопросом, почему API такой, когда &
является самым ограниченным из указателей. ~
должен работать так же хорошо здесь; это не похоже на то, что повторяющиеся строки уже существуют где-то еще и нуждаются в заимствовании.
Ответ 3
Сначала я подумал, что можно использовать copy line
для создания указателя владения с заимствованного указателя на строку, но это, по-видимому, копирует закодированный указатель.
Итак, я нашел str::from_slice(s: &str) -> ~str
. Это, вероятно, то, что вам нужно.