回答
任何动态型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