rust String切片的生存期

umuewwlo  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(95)

我正在翻阅Rust Black Book,它提到了生存期省略规则,以及如何特别是对于输入和返回&str(存储在堆栈上的字符串)的函数,不需要显式的生存期。我的问题是他们为什么要这样做。我在rust中可视化字符串的方式有点像变量现在持有的切片。是不是错了?

let mut s = String::from("alfdj");
        let k = &s[0..1];
        let s = "laskjd";
        println!("{}",k);`

这就是我所尝试的,也是我对字符串s和切片k之间关系的困惑。我重新定义了s,它对k没有影响,这就是为什么我认为&str k独立于字符串s。

o2gm4chl

o2gm4chl1#

这就是所谓的variable shadowing。当你使用letlet mut定义一个变量时,你正在创建一个新的变量,它碰巧具有相同的变量名。旧变量仍然存在,但无法通过其名称访问。这是词法作用域概念的一部分。您的代码段等效于以下内容:

let mut s = String::from("alfdj");
let k = &s[0..1];
let w = "laskjd";
println!("{}",k);

在这里,我们只是将第二个s替换为w
当你调用一个函数时,也会发生同样的事情。例如,在代码中

fn scoping() -> i32 {
   let x = 3;
   let g = |mut x| {
      x += 1;
      x
   };
   g(x) + x // evaluates to 7; calling g(x) doesn't change x
}

有两个不同的变量,都命名为x。类似地,我们可以发生以下情况:

let x = 3;
{
   let x = 4;
   println!("{}", x); // 4
   let x = "abc";
   println!("{}", x); // abc
}
println!("{}", x); // 3

相关问题