回答
任何動態型OOP語言支持鴨打字,包括PHP。
這不是一個功能,而是編程風格。
是的,PHP是鴨子型語言。
$x = 1;
$x = 'string';
$x = new Person;
$x = 1/2;
第一個問題呢? – Gumbo 2011-04-09 13:58:24
這不是關於鴨子打字,'$ duck-> quack()'是(不關心鴨子的實際類別就是它可以嘎嘎聲) – 2011-04-09 14:11:29
靜態類型意味着一旦你定義了一個變量,它的生命週期就保持相同的類型。靜態語言通常要求你聲明類型,但有些類型推理 - 他們會從定義中推斷出類型。例如,在scala中,您可以編寫i = 1
,編譯器會推斷出i
的類型爲int
,但是您不能然後聲明i = "1"
,這會引發錯誤。
動態類型意味着您不必聲明變量的類型,並且可以更改變量的類型。在紅寶石中,您可以使用i = "1"
來關注i = 1
,這完全沒有問題。
鴨子打字是一種不同的概念,幾乎只適用於面向對象的語言。在使用Duck打字的語言中,對方法的參數不檢查類型,所以只要它響應接收到的任何調用,您傳遞給該方法的任何類型都是可接受的。
因此,舉例來說:
class Duck
def quacks
puts "Quack"
end
end
class FauxDuck
def quacks
puts "FauxQuack"
end
end
def quacker duck
duck.quacks
end
方法quacker將採取無論是鴨或FauxDuck,因爲無論是將要.quacks
雖然大多數面向對象的動態類型語言也鴨打字迴應,這不是要求。你可以有一種語言將類型聲明爲方法調用並強制它們,但仍然是動態類型的 - 記住,動態類型意味着你可以在定義它之後改變對象的類型。
在假定非鴨類型的紅寶石
class Duck
def quacks
puts "Quack"
end
end
class FauxDuck
def quacks
puts "FauxQuack"
end
end
def quacker Duck duck
duck.quacks
end
duck = Duck.new
quacker.duck ## no error
duck = FauxDuck.new ##redefining the type of the variable
quacker.duck ## throws an error at runtime
爲什麼你會想這樣做,我不知道,但它是提供給語言設計者選擇。
- 1. 動態打字沒有鴨子打字?
- 2. 動態語言界面和鴨子打字
- 3. Android:minEms支持所有語言(例如中文,阿拉伯語)嗎?
- 4. 所有Windows版本都支持Int64嗎?
- 5. .NET 4.0支持的動態語言DLR
- 6. 更改語言動態使用機器人多語言支持?
- 7. EXJS中的語言環境和動態多語言支持6
- 8. css:所有瀏覽器都支持最後一個孩子嗎?
- 9. 鴨子打字numpy浮動類型
- 10. 靜態鴨打字VS CRTP
- 11. 「鴨子打字」的詞源?
- 12. Android多語言和少數語言支持語言不支持語言區域
- 13. 在java中所有語言支持的字體windows上的JTextArea
- 14. 國際化 - 支持所有語言的字符集?
- 15. SpeechRecognizer支持其他語言嗎?
- 16. 流星JS支持RTL語言嗎?
- 17. Android NDK支持語言環境嗎?
- 18. 做android支持多種語言嗎?
- 19. TypeScript鴨子打字,想要強力靜態打字
- 20. Android語言支持
- 21. 多語言支持
- 22. PyroCMS語言支持
- 23. EditText語言支持?
- 24. Yocto語言支持
- 25. 支持RTL語言
- 26. ILGeoNames語言支持
- 27. 多語言支持
- 28. 在鴨子型語言中模擬靜態類型的方面
- 29. 語法與支持語言
- 30. 鴨子打字:使用鴨子打字將Ruby代碼翻譯成Javascript
鴨子打字絕對是一種語言功能,而不是編程風格。動態類型化語言*可以*聲明和強制方法調用的類型,如果它確實,那麼它將不支持鴨子打字。 – philosodad 2015-04-02 20:12:08