我正在翻阅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。
1条答案
按热度按时间o2gm4chl1#
这就是所谓的variable shadowing。当你使用
let
或let mut
定义一个变量时,你正在创建一个新的变量,它碰巧具有相同的变量名。旧变量仍然存在,但无法通过其名称访问。这是词法作用域概念的一部分。您的代码段等效于以下内容:在这里,我们只是将第二个
s
替换为w
。当你调用一个函数时,也会发生同样的事情。例如,在代码中
有两个不同的变量,都命名为
x
。类似地,我们可以发生以下情况: