我今天遇到了Dart的奇怪行为.我对局部变量和词法范围的理解肯定有问题.让我们进入一些代码.上下文是测试分数从数字到字母的转换,但这并不是理解的关键.
首先,考虑这段代码,它的工作方式与预期一致:
void main() {
final pairs = <List>[
[95, 'A'],
[85, 'B'],
];
for (final pair in pairs) {
int number = pair[0];
String letter = pair[1];
test('$number converts to $letter', () {
final actual = convert(number);
expect(actual, letter);
});
}
}
String convert(int value) => value >= 90 ? 'A' : 'B';
运行测试,它通过了.将第二行测试数据从85更改为95,则第二次测试失败.我明白这一点.
现在考虑这个替代实现.注意,唯一的区别是现在在for
循环之外声明了number
和letter
变量.
void main() {
final pairs = <List>[
[95, 'A'],
[85, 'B'],
];
int number;
String letter;
for (final pair in pairs) {
number = pair[0];
letter = pair[1];
test('$number converts to $letter', () {
final actual = convert(number);
expect(actual, letter);
});
}
}
String convert(int value) => value >= 90 ? 'A' : 'B';
按原样运行这段代码会产生预期的结果:两个测试成功,它们的名称分别是"95个转换为A"和"85个转换为B".但是,现在将测试数据中的85更改为95.现在,有both次测试失败.测试的名字正如人们所预料的:"95个转换为A"和"95个转换为B".
我已经try 在测试方法中设置断点来解决这个问题.当测试运行时,第一个测试的名称是"95转换为A",但在该测试体中,值letter
是"B".
我已经和编程语言打交道很长时间了,但我还是目瞪口呆.有人能给我解释一下这里发生了什么事吗?我不明白为什么这两个程序会有不同的表现.