我花了几个小时在 Dart 程序中发现错误。
最多,我发现类似以下内容:
class User{
String name;
User(String name){
name = "user +$name";
}
}
内部属性应该是 _name ,但是开发人员忘记了此规则。
该代码将空结果提供给:
User u1 = new User("U1");
print(u1.name);
> null
我的问题是:
我感到奇怪的是,编译器允许在调用参数和代码内部重用相同的var名称而没有任何警告。
我认为,如果某些参数类似于* User(String name)*,则name的进一步使用应为只读。
这是语言的弱点吗?
您是否看到过其他语言的相同PB?
最佳答案
我可以看到您来自哪里,但这是与Java相同的作用域规则(以及C#吗?),以及方法和构造函数的参数的正常行为。
我认为用另一个值重新分配参数是不良行为,您可以通过向analysis_options.yaml
添加以下linter规则来使分析器检测到该错误:
linter:
rules:
parameter_assignments
规则描述如下:
http://dart-lang.github.io/linter/lints/parameter_assignments.html
但是我可以看到,此规则不适用于您所使用的构造函数,并且我想这可能是linter的错误,或者是应该存在另一条规则来检测构造函数的参数的情况。因此,我建议您在此处创建一个问题:https://github.com/dart-lang/linter/issues
可以通过对每个参数使用
final
来实现参数(方法和构造函数)的只读行为: User(final String name) {
name = 'user +$name'; // error: 'name' a final variable can only be set once
}
但这在希望防止开发人员忘记做某事的事故的意义上是不实际的。
仅作记录,您可以通过执行以下操作在
name
类中分配User
值(如果您仍然希望参数和类变量具有相同的名称):class User {
String name;
User(String name) {
this.name = 'user +$name';
}
}
关于dart - 这是Dart编译器的默认设置吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58497685/