我是Rust的初学者,只是学习所有权概念.
我正在使用此函数来反转String
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");
}
Run Code Online (Sandbox Code Playgroud)
我想了解谁拥有robot和tobor.
argument 1的assert_eq!.我对吗?reverse,所需的内存不断增加.确实argument 1的assert_eq!帐户是什么?你的说法大多是错的,让我试着纠正它们.
传递一个字符串切片,返回一个字符串切片
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);
}
Run Code Online (Sandbox Code Playgroud)
(游乐场)
因此,当我们收集反向字符串时,我认为我们将它收集到assert_eq的参数1中!
不,你把它收集成一个字符串,就是这样collect::<String>().你的函数reverse也会返回一个String.
这意味着,您正在调用函数reverse,该函数返回一个String并且您将其String作为assert_eq!宏的第一个"参数"传递.
所需的内存不断增加.assert_eq的参数1!占了那个?
不,应该怎么做?这一切都在reverse函数内部完成.assert_eq!只需要两个参数.他们来自哪里是不确定的,不需要知道.
assert_eq!(&reverse(input), expected)
这一行中发生的是,您reverse使用inputas参数调用函数.但通常你不能比较&T与T(一个参考的东西与实际情况的东西),这也正是&(符号)前面reverse的用武之地.String实现Deref特征,这意味着它也可以被视为一个特征str(参见Deref的文档).但现在你正试图以比较str有&str,这是不行的,这就是为什么你把&在前面,这样你实际上结束了&str和&str你可以比较有==.
我想了解谁拥有
robot和tobor.
没有人.实际上它们位于ELF/Binary本身的数据部分内.他们本身没有所有者,但可以在&str任何需要的地方使用.
| 归档时间: |
|
| 查看次数: |
89 次 |
| 最近记录: |