您是否经常以一种在静态类型语言中真正不可行的方式利用动态类型?
我感兴趣的是,在现实世界(而不是演示)代码中使用它们的频率是多少?
答案 0 :(得分:8)
说实话:大多数有益于动态语言(注意我说的是“动态语言”,而不是“动态类型语言”)提供与动态类型本身没有任何关系(Python是我最喜欢的语言!)。他们只受到如此多的关注,因为大多数静态类型的语言在灵活性方面都很难。 Haskell经常在涉及这个主题时指出 - 有一个原因。在实践中,我发现静态但具有表现力(例如固有通用)和动态类型系统之间的区别很小。
通常与动态类型相关的主要好处是广泛的多态性/鸭子打字/通用程序编程。例如。如果有人出现并将其传递给不同类型的东西,只要它具有我的代码使用的字段/方法(假设它们大致相同),我的大多数Python代码都能正常工作。基本上,它为我们节省了创建尽可能简约的接口的麻烦,并在我们可能希望传递给该特定函数的每个类中显式实现。好处应该是不言而喻的。
如上所述,这与静态/动态类型无关(这是structural typing这个东西,imho归结为在编译时使用更广泛的编译检查进行鸭子打字。然而,在实践中这两者是相辅相成的,因为没有静态类型的主流语言与结构类型(ML / Ocaml / Haskell / ...不是主流,而Go还有很长的路要走)可能的例外C ++模板(与Haskell相比,这是无限的痛苦)。
答案 1 :(得分:1)
理论上,通过在某种标记联合中编码值并使所有操作根据输入“类型”(实际上是输入值)正确运行,您基本上可以在大多数静态类型语言中“模拟”动态类型。当然,您必须引入一堆运行时错误行为,当您在这些值上遇到无意义的操作时会发生这些行为。
大多数非常非常难以做到的事情都是有风险或者不正确的事情。由于反射的自然编码更为自然,因此动态类型语言中的大量元编程更容易,而无需实例化高阶类型。
但是,为了回答你的问题,我认为动态类型没有任何方法可以提供在合理的静态类型语言中不可行的功能。
答案 2 :(得分:0)
恕我直言,动态打字在最好的情况下是“Meh”,并且在最坏的情况下会导致更多的错误,当涉及到价值观时。换句话说,就价值观而言,我没有任何好处。
真正的价值在于动态类型语言提供的元编程潜力。没有像Grails这样的框架是不可能的。 grails的作用的一个例子是:如果你有一个域类,向它添加一个变量,那么框架会自动将方法“findByYourVar”放在域类上,在运行时可用。因此,框架会为您提供所有用Java(或其他)编写繁琐的常见持久性方法。