Ваши претензии в основном неверны, позвольте мне попытаться их исправить.
Передача фрагмента строки, возвращение фрагмента строки
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
везде, где это необходимо.