Подтвердить что ты не робот

Как преобразовать & 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. Но это всего лишь пример.

Итак, как мне получить принадлежащую строку из заимствованной строки? Или я полностью недопонимаю.

4b9b3361

Ответ 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. Это, вероятно, то, что вам нужно.