Передача фрагмента строки, возвращая фрагмент строки.Но кому это принадлежит? - PullRequest
0 голосов
/ 23 ноября 2018

Я новичок в Rust и просто изучаю концепцию владения.

Я использую эту функцию, чтобы изменить строку

fn reverse(input: &str) -> String {
    //we are receiving a borrowed value, 
    input
    //get an iterator of chars from the string slice
    .chars()
    //Goes between two iterators. 
    //From the doc:  double-ended iterator with the direction inverted.
    .rev()
    //collect into a String
    .collect::<String>()
}

fn process_reverse_case(input: &str, expected: &str) {
    assert_eq!(&reverse(input), expected)
}

fn main() {
    process_reverse_case("robot", "tobor");
}

Я хотел бы понять, кому принадлежит robot и tobor.

  • Я передаю заемную стоимость.Это фрагмент строки.
  • Я понимаю, что это нельзя изменить.Поэтому, когда мы собираем перевернутую строку, я думаю, что мы собираем ее в argument 1 из assert_eq!.Я прав?
  • Но поскольку процесс обращения + сбора происходит внутри reverse, необходимая память продолжает увеличиваться.Учитывает ли это argument 1 из assert_eq!?
  • Приведенный выше вопрос мог быть решен компилятором во время компиляции.Я прав?

1 Ответ

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

Ваши претензии в основном неверны, позвольте мне попытаться их исправить.

Передача фрагмента строки, возвращение фрагмента строки

fn reverse(input: &str) -> String вы принимаете фрагмент строки , но возвращаете String.String "владеет содержимым строки ".


Я понимаю, что [фрагмент строки] не может быть изменен

Вы можете изменить &mut str, например,

fn to_lower(s: &mut str) {
    s.make_ascii_lowercase();
}

fn main() {
    let mut a = String::from("ABC");
    println!("{}", a);
    to_lower(&mut a);
    println!("{}", a);
}

( детская площадка )


Поэтому, когда мы собираем обратную строку, я думаю, что мы собираем ее в аргумент 1 assert_eq!

Нет.Вы собираете его в строку, для этого collect::<String>().Также ваша функция reverse возвращает String.
Это означает, что вы вызываете функцию reverse, которая возвращает String, и вы передаете этот String в качестве первого "аргумента"assert_eq! макрос.


объем памяти продолжает увеличиваться.Имеет ли аргумент 1 assert_eq!счет за это?

Нет, как это должно?Это все сделано внутри функции reverse.assert_eq! просто принимает два параметра.Откуда они берутся, неизвестно и не нужно знать.


assert_eq!(&reverse(input), expected)

В этой строке происходит то, что вы звоните своему reverse функция с input в качестве параметра.Но обычно вы не можете сравнить &T с T (ссылка на что-то с фактическим экземпляром что-то ), вот где & (амперсанд) впередииз reverse вступает в игру.String реализует черту Deref , что означает, что она также может рассматриваться как str (см. Документ для Deref ).Но теперь вы пытаетесь сравнить str с &str, который не работает, и поэтому вы ставите & впереди, так что вы на самом деле получаете &str и &str, которые вы можете сравнить с ==.


Хотелось бы понять, кому принадлежат robot и tobor.

Никто.На самом деле они живут внутри раздела данных в самом ELF / Binary.Они не имеют владельца как такового, но могут использоваться как &str везде, где это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...