rust - 传递一个字符串切片,返回一个字符串切片。但谁拥有它?
问题描述
我是 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
。
- 我正在传递一个借来的值。这是一个字符串切片。
- 我知道这是无法修改的。因此,当我们收集反转字符串时,我认为我们将其收集到 a
argument 1
of 中assert_eq!
。我对吗? - 但是随着内部发生反转+收集的过程,
reverse
所需的内存不断增加。是否argument 1
考虑assert_eq!
到这一点? - 编译器在编译时可能已经解决了上述问题。我对吗?
解决方案
你的说法大多是错误的,让我试着纠正它们。
传递一个字符串切片,返回一个字符串切片
fn reverse(input: &str) -> String
您正在接受一个字符串 slice,但返回一个String
. A String
“对字符串的内容拥有所有权”。
我了解此 [a string slice] 无法修改
您可以修改 a &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
,它返回 aString
并且您将其String
作为第一个“参数”传递给assert_eq!
宏。
所需的内存不断增加。assert_eq 的参数 1! 占那个?
不行,应该怎么办?这一切都在reverse
函数内部完成。assert_eq!
只需要两个参数。他们来自哪里是不确定的,不需要知道。
assert_eq!(&reverse(input), expected)
这一行发生的事情是,您正在使用as 参数调用您的reverse
函数。input
但通常你不能&T
与T
(a reference to something和something的实际实例) 进行比较,这就是&
前面的 (&)reverse
发挥作用的地方。String
实现了Deref
trait,这意味着它也可以被视为 a str
(参见Deref的文档)。但是现在您尝试将 astr
与进行比较&str
,这不起作用,这就是您放在&
前面的原因,因此您实际上最终得到了&str
并且&str
可以与进行比较==
。
我想了解谁拥有
robot
和tobor
。
没有人。事实上,它们存在于 ELF/二进制本身的数据部分中。它们本身没有所有者,但可以在&str
任何需要的地方使用。
推荐阅读
- macos - 如何知道 FSEvents 事件是否对应于仍在写入的新文件
- asp.net - 格式化日期时出现 InvalidOperationException
- pdf - 使用 itextsharp 将页面附加到电子签名的 pdf
- android - 在 Android 10 中获取蓝牙本地 mac 地址
- python - 具有演示架构的 Pytorch CNN 将学习,但准确性不会提高
- kubernetes - k8s prometheus:prometheus 中的哪个指标告诉命名空间的 cpu 和内存限制
- javascript - XHR 更新失败,字符串包含“#”,其中表单发布成功
- c++ - 来自文本文件的 BellmanFord 没有提供与手动输入相同的输出
- python - 使用设计模式创建多个条件和对象
- swift - API 测试中对成员的模糊引用