2013-07-06 35 views
3

在飞镖中,有一个var,这意味着dynamic type当声明一个局部变量时,最好在Dart中声明类型或使用`var`?

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

String name = "Freewind"; 

var name = "Freewind"; 

起初我还以为他们是一样的,因为编辑器应该能够推断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 

我试了Dar tEditor(基于eclipse)和IDEA,发现既没有在hello(m)上发出警告。看起来他们把m当作dynamic,而不是int,所以他们不给出警告。

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

或者仅仅因为Dart的编辑不够强大而没有警告我们会在将来发出警告?

+1

只是为了检查 - 你的意思是'无效你好(姓名:字符串)'或'无效你好(字符串名称)'? –

+1

对不起,我把dart与scala混合:) – Freewind

回答

6

从Dart常见问题解答:

飞镖是否有类型推断?

类型推理不是语言规范指定的东西,但它是实现可以自由执行的事情。记住Dart有一个动态类型系统是非常重要的,所以类型推理不会像在Haskell这样的语言中扮演同样的角色。但是,Dart编辑器确实会进行某种类型的推理,例如当您将var用于局部变量时。我们希望Dart VM和dart2js在性能或其他原因有用时使用类型推断。


从DART风格指南:

喜欢使用VAR没有类型标注为局部变量

现代代码方法主体往往是短,和类型的局部变量的几乎都是平凡可从初始化表达式推导出来,因此显式类型注释通常只是视觉噪声。体面的编辑者可以推断出局部变量的类型,并仍然提供你期望的自动完成和工具支持。


问:当声明一个局部变量,最好声明类型或只是使用var,在飞镖? A:更好的使用'var'的方法。


问:或者没有警告,仅仅是因为Dart的编辑不够强,我们会在将来发出警告?

答:可能在不久的将来,新的Dart Editor分析仪将得到全面实施和改进。

4

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

的排序。通过提供类型信息,您可以向工具和同类人员提供关于您的意图的信息。这取决于你使用任何类型信息的工具。

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

通过成功运行,在生产模式下的代码被处理,就好像是

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) { ... }voidString是在生产模式下被忽略,但可以通过使用类型注释工具和人类。