dart - Dart:为什么类方法使用 this.variableName 或 variableName 的工作方式相同?
问题描述
我想知道它是否被有意设计为能够使用两种不同的方式来编写类方法,其中引用了一个实例属性,这听起来可能很模糊,所以我提供了一个小代码片段来说明我的观点。
起初,我的印象是我们使用this.age
而不是age
因为后者会修改所有实例age
属性,但是当我尝试使用 & 而不使用this.
关键字时,它只更改了changeAge
使用该方法的实例。
有两种写法的目的吗?
class Person{
String name;
int age;
Person({this.name, this.age});
void changeAge(int a){
this.age = a; // why can this be written: age = a; and achieve same result?
}
}
void main(){
Person foo = Person(name: 'foo', age: 16);
Person bar = Person(name: 'bar', age: 30);
foo.changeAge(99);
print(foo.age); // prints 99
print(bar.age); // prints 30
}
解决方案
Dart 使用词法作用域来查找标识符的含义。编写age
时,编译器:
- 首先检查当前函数中是否存在局部变量名
age
。 - 然后它检查是否存在名为 的周围函数的参数或类型参数
age
。 - 然后它检查是否有
age
在周围类中命名的声明(在 中Person
)。这可以是实例声明或静态声明。 - 然后它检查名为 的类的类型参数
age
,如果该类是泛型的。 - 然后它检查当前库是否有一个名为
age
. - 然后它检查一个名为
age
.
如果它找到任何声明,则它认为age
是指该声明。如果它找到的是一个静态声明,那么age
就等价于ClassName.age
. 如果它找到了一个实例声明,则age
等价于this.age
.
如果它什么也没找到,并且它在一个实例方法中,那么它会age
被视为this.age
,如果当前类中没有继承age
的实例成员,则它是一个错误。
所以,在这种情况下,原因age = a;
和this.age = a;
相同是age
解析为周围类的实例变量。
你不必写this.age
,但你可以,这就是为什么你可以把你的changeAge
方法写成:
void changeAge(int age){
this.age = age; // `this.age` is the field, `age` refers to the parameter.
}
推荐阅读
- xml - Windows 更新后的网站面板错误:XML 文档中不允许输入类型
- html - 如何使用 flex 方向将多个 div 定位在 div 内的不同位置?
- r - 如何解析要用作标签的表达式(ggplot2)
- python - 在python中转换为二进制补码
- forms - 我的文本表单小部件没有滚动,再次出现同样的问题。我尝试添加 SingleChildScrollView 但它不起作用
- java - Java else if 和 else 在 while 循环下使用 Scanner 时不起作用
- ionic-framework - 三个 js textureloader 显示 CORS 错误以从 Ionic App 的 iframe 中从 S3 Bucket 加载数据
- java - 我需要将正确的字符串放在“new FileReader(“stringpath”)”中的括号中
- c++ - 从零开始的 Linux 10.2.0 gcc 失败
- php - MySQL 填充另一个表 - 使用过程或其他方式