- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在学习 Rust,我遇到了这个:
let mut x: i32 = 1;
x = 7;
let x = x; // x is now immutable and is bound to 7
let y = 4;
let y = "I can also be bound to text!"; // y is now of a different type
这怎么可能安全?请检查以下内容:
let temp = 23;
// 200 lines of code
// I'm changing something here <====== IMPORTANT
let temp = 101;
// 200 lines of code
// do something with temp (with 23 not 101 !!!)
如果我再次执行 let temp = 101
,我无法知道我刚刚在代码中创建了一个讨厌的错误。我真的需要在键入 let temp
之前搜索 let temp
吗?我错过了什么?
最佳答案
问题不在于 Rust,也不在于任何编程语言,而在于代码。特别是这条“线”:
// 200 lines of code
如果您在声明变量和使用变量之间编写 200(或 400!)行代码,很可能会发生意想不到的事情。但是,如果变量是可变的并且您不小心更改了它,那么无论发生什么情况都可能发生:
let mut a = 1;
a += 1;
// or
let a = 1;
let a = 2;
两者的最终结果相同,但只有一个涉及阴影。
就我个人而言,我发现阴影对于 Rust 的包装器类型(如 Option
或 Result
)非常有用:
fn foo(name: Option<&str>) {
let name = name.unwrap_or("Who are you");
println!("{}", name);
}
如果您发现自己无法处理变量阴影,那么我建议您查看 Clippy ,它有多个 shadow_*
lints,如果你有任何阴影,你可以打开并禁止你的代码编译。
Sometimes you are changing someone else's code. I have no way to know that
a
is already being used. How do I pick a variable name then?
我建议您在修改代码之前阅读代码。一些编辑器还允许在文本中搜索模式或突出显示模式。
I'm coming from Java where that's exactly backwards! Meaning, once you declare
int x
in a scope you can't redeclare it.
没错,但您仍然可以隐藏您的实例或类变量:
public class HelloWorld {
static int a = 42;
public static void main(String[] args) {
int a = 21;
System.out.print(a); // Oh no, it's not 42 anymore!
}
}
Java 编译器不会阻止这个错误;这取决于您、您的测试、您的代码审查或外部 linting 工具。
How do you avoid accidentally redeclaring a variable inside a code block in Rust?
您可以在办公 table 旁放一张小纸片。在上面写上数字零。每次声明一个新变量时,都会将数字加一。使用该数字作为所有变量的前缀或后缀。
为了安全起见,您还可以将您的名字添加到变量中 - 您不希望与遵循相同算法的其他任何人发生冲突。您可能还想将函数和类型添加到变量的名称中,以避免不同函数之间的冲突。
当然,这些变量名可能会很长。要解决这个问题,您可能需要缩写以上所有内容,并将数字写为十六进制或 Base64。您可以拥有相当独特的 mtcfjdxBA8293
,而不是 my_type_cool_function_john_doe_x_12223123
。这不太可能与任何现有变量发生冲突。
(以上为讽刺)
别搞错了:我强烈相信问题是不是变量阴影:它是数百行长的函数,需要大量的脑力消耗。创建函数,在这些类型上创建类型和方法,但在将代码进一步更改为更糟之前以某种方式修复代码。
关于rust - 如何避免在 Rust 的代码块内意外地重新声明变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41051567/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许在 Stack Overflow 上提出有关通用计算硬件和软件的问题。您可以编辑问题,使其成为
当我尝试在 db2 中创建表时,它抛出以下错误 $ db2 CREATE TABLE employee(emp_id INT NOT NULL, emp_name VARCHAR(100)) sh:
我有: while (i < l) { if (one === two) { continue; } i++; } 但是 JSLint 说: Problem at line 1 chara
所以我有这个代码: char inputs[10] = ""; int numInputs = 0; while (numInputs < 10){ char c; printf("E
var ninja = { name: 'Ninja', say: function () { return 'I am a ' + this.name; }
我收到一个我不明白的错误,请注意,我是编码新手,所以这可能是一个简单的错误。 #include using namespace std; int main() { //Initialise Fahr
我正在使用 javascript 和 react,由于某种原因,我收到了一个奇怪的 token 错误。 这是发生错误的代码: renderNavBar() { if (!this.us
Closed. This question is off-topic。它当前不接受答案。
由于某种我无法解释的原因,编译器正在输出一个错误,指出它发现了一个意外的#else 标记。 这发生在文件的开头: #if defined( _USING_MFC ) #include "stda
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
这个问题在这里已经有了答案: Difference between sh and Bash (11 个答案) 关闭 2 年前。 我正在编写一个简单的 bash 脚本,我在 XX `(' unexpe
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 此问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-topic
我在 Windows 7 上编写了一个脚本,它不断给我一个错误“(此时出乎意料。”对于以下代码 if %vardns%=="NODNS" ( netsh interface ipv4 set ad
我正在尝试使用xmlstarlet(使用xpath)解析XML文件,但是出现语法错误,并且我不知道如何更正我的代码。 这是我的脚本: #!/bin/bash if [ $1=="author" ];
以下脚本旨在在目录中的所有文件上运行程序“senna”,并将每个文件的输出(保留输入文件名)写入另一个目录 for file in ./Data/in/*; do ./senna -iobta
我从 challengers.coffee 运行此代码,并收到错误 ActionView::Template::Error (SyntaxError: [stdin]:3:31:unexpected
我在 config.db.database; 行中有语法错误(意外的标记“.”)。这是我在文件中的代码 const config = require('../config/config') const
这一定很明显,但是我无法使它正常工作。我正在尝试传输应该用于构建$ classKey的对象,这反过来又导致删除所需的软件(amd64或i386)。好吧,这里的代码: $name = @("softwa
我正在使用 1.3.7 版学习 Grails,但我一直无缘无故地遇到以下语法错误: unexpected token: mapping @ line x, column y. 有一次,我通过运行“gr
我正在尝试找出这段Pascal代码的问题 function Factorial(n: integer): integer; begin if n = 0 then Result := 1
我是一名优秀的程序员,十分优秀!