2010-08-01 77 views
7

我習慣於在運行時動態輸入意義檢查對象/非面向對象結構的類型信息,並拋出某種類型的錯誤,即如果它像鴨子那樣嘎嘎叫鴨子。是否有不同類型的動態類型(請詳細說明)。動態打字沒有鴨子打字?

回答

1

不,動態類型是當值有類型但變量沒有時,所以大多數類型檢查是在運行時完成的。所以,基本上,如果價值像鴨子一樣散步或呱呱叫,那就是一隻鴨子,否則就會引發錯誤。 Duck打字實際上只是描述了動態類型的一個特性,它確保它是類型安全的(即只有在變量foo'具有正確的屬性或可以執行該方法時,方法纔會運行)。

+4

這是不正確的。它不檢查類型,只是該類型可以執行某個運算符X或具有某個屬性Y.如果對變量調用toString(),那麼如果它是一個對象並且它實現了toString()方法,那麼它將被調用,否則,你會得到一個錯誤。但是很多類型都可以滿足這個要求。 – siride 2010-08-01 14:57:16

+0

好點,我會編輯 – 2010-08-01 15:22:36

5

是的,絕對。鴨子打字是一種習慣用語,它表示此時此刻的價值類型是基於它現在擁有的領域和方法。動態類型只是說類型與運行時間值相關,而不是靜態變量和參數。兩者之間有區別,你可以在沒有前者的情況下使用後者。例如,如果您使用PHP進行編程並將自己的基本類型限制爲不使用OO,那麼您將使用動態輸入而不使用鴨子輸入。

+0

你能否詳細說明你的例子?你只是說在運行時檢查類型是動態類型,而基於測試方法和屬性的對象檢查被稱爲鴨子打字?即,你會說,兩者之間的差異與*對象*有關嗎?在這兩種情況下(非鴨動態和鴨打字),它看起來像運行時檢查某些操作(方法調用,添加等)與輸入值的兼容性;是對的嗎?唯一的區別是鴨子打字涉及對象,而動態打字更爲普遍,對嗎? – EOL 2011-01-07 09:53:34

+1

@EOL:是的,類型檢查是動態類型的(應該真的叫做'動態檢查',檢查屬性存在是鴨子打字。'關注對象'的東西有點模糊,說它是正確的,但我認爲我們'都在同一頁上。 – 2011-01-08 01:13:40

+0

謝謝!我現在看到兩者之間更好的區別。 – EOL 2011-01-08 22:31:56