在飞镖中,有一种var方法dynamic type.
声明局部变量时,我可以写:
String name = "Freewind";
Run Code Online (Sandbox Code Playgroud)
要么
var name = "Freewind";
Run Code Online (Sandbox Code Playgroud)
起初我还以为他们是一样的,因为编辑器应该能够推断类型name就是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
Run Code Online (Sandbox Code Playgroud)
我尝试使用DartEditor(基于eclipse)和IDEA,发现它都没有发出警告hello(m).看来,他们对待m作为dynamic,不int,所以他们不给警告.
如果我理解正确,我们应该尽可能多地声明类型以获得类型安全检查,对吧?但我喜欢var它因为它更短,不需要复制类型信息.
或者没有警告只是因为Dart的编辑不够强大,我们将来会收到警告?
来自Dart FAQ:
Dart有类型推断吗?
类型推断不是语言规范指定的东西,但它是实现可以自由执行的东西.重要的是要记住Dart具有动态类型系统,因此类型推理与Haskell等语言中的角色不同.但是,Dart编辑器会执行某些类型的推理,例如当您将var用于局部变量时.我们希望Dart VM和dart2js在对性能或其他原因有用时会使用类型推断.
来自Dart风格指南:
使用var的PREFER没有局部变量的类型注释
现代代码中的方法体往往很短,并且局部变量的类型几乎总是可以从初始化表达式中轻易推断出来,因此显式类型注释通常只是视觉噪声.体面的编辑器可以推断出局部变量的类型,并且仍然提供您期望的自动完成和工具支持.
问:声明一个局部变量时,最好var在Dart中声明类型或只使用它?
答:使用'var'的更好方法.
问:或者没有警告只是因为Dart的编辑不够强大,我们将来会收到警告?
答:当新的Dart编辑器分析仪得到全面实施和改进时,可能会在不久的将来到来.
如果我理解正确的话,我们应该尽可能多地声明类型以获得类型安全检查,对吗?
有点。通过提供类型信息,您可以向工具和其他人提供有关您的意图的信息。使用您提供的任何类型信息取决于工具。
Dart 本身以两种模式运行 -检查模式或生产模式。当您从编辑器运行应用程序时,默认情况下它会在检查模式下运行。这可以在代码运行时有效地执行类型断言。上面给出的示例在没有警告的情况下通过了静态分析器,但在检查模式下无法运行。在生产模式下,它将尝试运行(在本例中将成功运行)。
通过成功运行,在生产模式下,您的代码将被视为
void hello(name) { print("Hello $name"); } // note the lack of type info on the signature
var i = 123;
hello(i); // "Hello 123"
Run Code Online (Sandbox Code Playgroud)
这实际上与 JavaScript 相同——它将一直运行到故障点。类型信息只是注释,形式化为语言,因此当您编写时
voidhello(Stringname) { ... } 和是在生产模式中被忽略的类型注释void,但可以被工具和人类使用。String
| 归档时间: |
|
| 查看次数: |
323 次 |
| 最近记录: |