传递一个字符串切片,返回一个字符串切片.但是谁拥有它?

clm*_*mno 1 rust

我是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)

我想了解谁拥有robottobor.

  • 我传递了借来的价值.这是一个字符串切片.
  • 我明白这个不能修改.所以,当我们收集的反转字符串,我认为我们正在收集它变成argument 1assert_eq!.我对吗?
  • 但随着逆转+收集的过程发生在内部reverse,所需的内存不断增加.确实argument 1assert_eq!帐户是什么?
  • 上述问题可能是编译器在编译时解决的.我对吗?

hel*_*low 5

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

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

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参数调用函数.但通常你不能比较&TT(一个参考的东西与实际情况的东西),这也正是&(符号)前面reverse的用武之地.String实现Deref特征,这意味着它也可以被视为一个特征str(参见Deref文档).但现在你正试图以比较str&str,这是不行的,这就是为什么你把&在前面,这样你实际上结束了&str&str你可以比较==.


我想了解谁拥有robottobor.

没有人.实际上它们位于ELF/Binary本身的数据部分内.他们本身没有所有者,但可以在&str任何需要的地方使用.