6

在 dart 中,有一个varwhich 的意思dynamic type

当声明一个局部变量时,我可以写:

String name = "Freewind";

或者

var name = "Freewind";

一开始我以为它们是一样的,因为编辑器应该可以推断出nameis的类型String,但我很快发现:

void hello(String name) { print("hello, $name"); }

int n = 123;
hello(n);      // editor will give an warning here

var m = 456;
hello(m);      // but will not here

我尝试使用 DartEditor(基于 Eclipse)和 IDEA,发现在hello(m). 似乎他们将mas 视为dynamic, not int,因此他们不发出警告。

如果我理解正确,我们应该尽可能多地声明类型以获得类型安全检查,对吗?但我喜欢var它,因为它更短,不需要复制类型信息。

还是因为 Dart 的编辑不够强大而没有警告,我们以后会收到警告?

4

2 回答 2

9

来自 Dart 常见问题解答:

Dart 有类型推断吗?

类型推断不是语言规范指定的东西,但它是实现可以自由做的事情。重要的是要记住 Dart 有一个动态类型系统,因此类型推断所起的作用与它在 Haskell 等语言中所起的作用不同。但是,Dart Editor 确实会进行一些类型推断,例如当您将 var 用于局部变量时。我们希望 Dart VM 和 dart2js 在对性能或其他原因有用时会使用类型推断。


来自飞镖风格指南:

更喜欢使用没有类型注释的局部变量的 var

现代代码中的方法体往往很短,并且局部变量的类型几乎总是可以从初始化表达式中轻松推断出来,因此显式类型注释通常只是视觉噪音。体面的编辑器可以推断局部变量的类型,并且仍然提供您期望的自动完成和工具支持。


varQ: 声明局部变量时,最好在 Dart中声明类型还是直接使用, ?

A:更好的方式来使用'var'。


Q:还是因为 Dart 的编辑能力不够强而没有警告,我们以后会收到警告?

答:可能会在不久的将来完全实现和改进新的 Dart 编辑器分析器。

于 2013-07-06T09:19:31.843 回答
4

如果我理解正确,我们应该尽可能多地声明类型以获得类型安全检查,对吗?

有点。通过提供类型信息,您可以向工具和其他人提供有关您的意图的信息。使用您提供的任何类型信息取决于工具。

Dart 本身以两种模式运行——检查模式或生产模式。当您从编辑器运行应用程序时,默认情况下它以检查模式运行。这在代码运行时有效地执行了类型断言。上面给出的示例在没有警告的情况下通过了静态分析器,但无法在检查模式下运行。在生产模式下,它会尝试运行(在这种情况下会成功运行)。

通过成功运行,在生产模式下,您的代码将被视为

void hello(name) { print("Hello $name"); } // note the lack of type info on the signature

var i = 123;
hello(i); // "Hello 123"

这实际上与 JavaScript 相同——它将一直运行到故障点。类型信息只是注释,形式化为语言,所以当你写

voidhello(Stringname) { ... }void和是在生产模式中被忽略的类型注释,但 可以String工具和人类使用。

于 2013-07-06T09:34:16.347 回答