2013-07-06 66 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是在生產模式下被忽略,但可以通過使用類型註釋工具和人類。