在我看来,静态类型和动态类型之间的区别归结为编码风格。尽管 Scala 中存在结构类型,但大多数时候程序员都在考虑对象的类型,包括 trait 等很酷的小工具。另一方面,我认为 Python/Javascript/Ruby 程序员根据对象的原型(方法和属性的列表)来思考,这与类型略有不同。
例如,假设有一个名为的类家族,Vehicle
其子类包括Plane
、Train
和Automobile
; 以及另一个类家族,Animal
其子类包括Cat
、Dog
和Horse
。Scala 程序员可能会创建一个称为 traitTransportation
或具有
def ride: SomeResult
def ride(rider: Someone): SomeResult
作为会员,她既可以处理,也可以Train
作为Horse
交通工具。Python 程序员只需传递 train 对象而无需额外的代码。在运行时,语言会发现对象支持ride
.
方法调用在运行时解析的事实允许 Python 和 Ruby 等语言拥有重新定义属性或方法含义的库。一个很好的例子是 O/R 映射或 XML 数据绑定,其中未定义的属性名称被解释为表/XML 类型中的字段名称。我认为这就是人们所说的“灵活性”。
在我使用动态语言的非常有限的经验中,我认为只要你不犯错误,用它们进行编码会更快。并且可能随着您或您的同事擅长使用动态语言进行编码,他们会犯更少的错误或开始编写更多的单元测试(祝你好运)。在我有限的经验中,我花了很长时间才发现 Scala 可以在一秒钟内捕获的动态语言中的简单错误。在编译时拥有所有类型也使重构更容易。