首页 > 解决方案 > 传递一个字符串切片,返回一个字符串切片。但谁拥有它?

问题描述

我是 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");
}

我想了解谁拥有robottobor

标签: rust

解决方案


你的说法大多是错误的,让我试着纠正它们。

传递一个字符串切片,返回一个字符串切片

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但通常你不能&TT(a reference to something和something的实际实例) 进行比较,这就是&前面的 (&)reverse发挥作用的地方。String实现了Dereftrait,这意味着它也可以被视为 a str(参见Deref的文档)。但是现在您尝试将 astr与进行比较&str,这不起作用,这就是您放在&前面的原因,因此您实际上最终得到了&str并且&str可以与进行比较==


我想了解谁拥有robottobor

没有人。事实上,它们存在于 ELF/二进制本身的数据部分中。它们本身没有所有者,但可以在&str任何需要的地方使用。


推荐阅读