我是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
的{{1}}中。我说的对吗?assert_eq!
内进行反向+收集过程时,所需的内存不断增加。 reverse
中的argument 1
占这个原因吗?答案 0 :(得分:5)
您的主张大多是错误的,让我尝试更正它们。
传递字符串切片,返回字符串切片
fn reverse(input: &str) -> String
您正在接受string slice,但返回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);
}
因此,当我们收集反向字符串时,我认为我们将其收集到assert_eq的参数1中!
不。您将其收集到一个字符串中,这就是collect::<String>()
的作用。同样,您的函数reverse
返回一个String
。
这意味着,您正在调用函数reverse
,该函数返回一个String
,并且您正在将该String
作为第一个“参数”传递给assert_eq!
宏。
所需的内存不断增加。 assert_eq的参数1!是这个原因吗?
不,应该怎么办?这一切都在reverse
函数内部完成。 assert_eq!
仅使用两个参数。它们的来源是不确定的,不需要知道。
assert_eq!(&reverse(input), expected)
此行中发生的事情是,您使用reverse
作为参数调用input
函数。但是通常您无法将&T
与T
(使用 something 的实际实例引用 something )进行比较,这就是{{ &
前面的1}}(和号)起作用。 reverse
实现了Deref
trait,这意味着它也可以被视为String
(请参见doc for Deref)。但是现在您正在尝试将str
与str
进行比较,这是行不通的,这就是为什么您将&str
放在前面,所以实际上您以&
和{ {1}},您可以将compare与&str
一起使用。
我想了解谁拥有
&str
和==
。
没人。实际上,它们位于ELF /二进制本身的数据部分中。他们本身没有所有者,但是可以在需要的地方用作robot
。