传递字符串切片,返回字符串切片。但是谁拥有它呢?

时间:2018-11-23 10:42:25

标签: 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");
}

我想了解谁拥有robottobor

  • 我正在传递借来的值。这是一个字符串切片。
  • 我知道这无法修改。因此,当我们收集反向字符串时,我认为我们正在将其收集到argument 1的{​​{1}}中。我说的对吗?
  • 但是,在assert_eq!内进行反向+收集过程时,所需的内存不断增加。 reverse中的argument 1占这个原因吗?
  • 以上问题可能已由编译器在编译时解决。我对吗?

1 个答案:

答案 0 :(得分:5)

您的主张大多是错误的,让我尝试更正它们。

  

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

fn reverse(input: &str) -> String您正在接受string slice,但返回StringString “拥有字符串内容的所有权”。


  

我了解无法修改此[字符串切片]

您可以修改&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);
}

playground


  

因此,当我们收集反向字符串时,我认为我们将其收集到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函数。但是通常您无法将&TT(使用 something 的实际实例引用 something )进行比较,这就是{{ &前面的1}}(和号)起作用。 reverse实现了Deref trait,这意味着它也可以被视为String(请参见doc for Deref)。但是现在您正在尝试将strstr进行比较,这是行不通的,这就是为什么您将&str放在前面,所以实际上您以&和{ {1}},您可以将compare&str一起使用。


  

我想了解谁拥有&str==

没人。实际上,它们位于ELF /二进制本身的数据部分中。他们本身没有所有者,但是可以在需要的地方用作robot