【问题标题】:Passing a string slice, returning a string slice. But who owns it?传递一个字符串切片,返回一个字符串切片。但谁拥有它?
【发布时间】:2018-11-23 10:42:24
【问题描述】:

我是 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 1assert_eq! 中。我说的对吗?
  • 但是随着逆向+收集的过程发生在reverse内部,需要的内存不断增加。 argument 1assert_eq! 是否说明了这一点?
  • 上述问题可能已由编译器在编译时解决。我对吗?

【问题讨论】:

    标签: rust


    【解决方案1】:

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

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

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


    我知道这个[字符串切片]不能修改

    您可以修改&amp;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::&lt;String&gt;() 的用途。您的函数 reverse 也返回 String
    这意味着,您正在调用函数reverse,它返回一个String,并且您将String 作为第一个“参数”传递给assert_eq! 宏。


    所需的内存不断增加。 assert_eq 的参数 1!考虑到这一点?

    不,应该怎么做?这一切都在reverse 函数内部完成。 assert_eq! 只需要两个参数。他们来自哪里是不确定的,不需要知道。


    assert_eq!(&amp;reverse(input), expected)

    这一行发生的事情是,您正在调用您的 reverse 函数,并使用 input 作为参数。但通常你不能将 &amp;TT (对 something 的引用与 something 的实际实例)进行比较,这就是 &amp;(与号)在reverse 前面发挥作用。 String 实现了Deref trait,这意味着它也可以被视为str(参见doc for Deref)。但是现在您尝试将str&amp;str 进行比较,这不起作用,这就是为什么您将&amp; 放在前面,所以您实际上最终会得到&amp;str&amp;str,您可以使用compare ==


    我想了解robottobor 的所有者是谁。

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

    【讨论】:

      猜你喜欢
      • 2016-06-22
      • 2020-11-27
      • 2019-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-30
      • 2023-04-09
      • 2014-07-21
      相关资源
      最近更新 更多