Scala中的特征与包

时间:2012-07-28 10:39:44

标签: scala namespaces package traits

看完Martin's keynote on Reflection and Compilers后,我似乎无法从头脑中得到这个疯狂的问题。马丁谈到了“(婚礼)蛋糕模式”,其中特质扮演着核心角色。我想知道,为什么在我们已经有特征时我们需要包裹? package可以做什么,trait(至少在理论上)不能做什么?

我不是在谈论当前的实现,我只是想象一下,如果我们用特征替换包,那会是什么样的编程。在我脑海里,它会是这样的:

  • 少一个关键字(package不需要)
  • 不需要package object s

总结我的所有问题:

  1. 理论上可以从语言中删除包并使用特征。
  2. 我们从这一变化中获得了哪些其他好处? (我正在考虑一流的包和一流的导入,但mixin组合是编译时的事情,虽然超级调用是动态绑定的)
  3. Java / JVM兼容性是唯一可以阻碍的吗?
  4. 更新

    Daniel Spiewak在this keynote中谈到依赖注入只是你可以用Cake Pattern做的所有事情的冰山顶。

2 个答案:

答案 0 :(得分:7)

Martin Odersky说Scala可以通过特征,对象,方法和路径来实现(我希望我没有忘记一些事情)。

类和包都在那里,因为Scala旨在成为托管语言,即运行的语言(这实际上不是有趣的位)和互操作(这是重要的)点)主机平台。 Scala旨在与之互操作的一些主机平台是Java平台和CLI,它们都具有类和包的概念(在CLI的情况下为命名空间),这些概念非常明显,不能轻易表达为特征或对象。这与接口不同,接口可以简单地映射到纯粹抽象的特征。

上述声明是在讨​​论可能从Scala中删除泛型的,因为泛型可以做的所有事情也可以通过抽象类型来实现。

答案 1 :(得分:6)

在scala中,对象和包的用途几乎相同,对象也称为模块。对象应该被视为模块,因为它们可以包含任何定义,包括其他对象,当然还有类型。

特质可以被认为是一个抽象模块。它可以包含任何定义,任何成员都可以是抽象的,包括类型成员。我正在背诵所有这些只是为了突出对称性。对我来说,特征似乎只是对象和功能性思想的融合,与scala一样具有创新性。

最后给出答案:

  1. 我认为可以删除包以支持对象(而不是特征)。
  2. 好处是简化 - 不需要明确定义包对象。
  3. 我认为包与Java / JVM兼容性的对象不同。
  4. 更多评论:在视频中,马丁谈论的特征(抽象模块)不仅仅是具体的模块,因为后者只是出现在最后时刻才能汇集和统一抽象模块的某些组合。

    即使不“混合蛋糕”,也可以使用抽象模块。例如在草拟一些代码时,您可以定义一个包含定义的模块。但是一旦你来到一个类型或值,你还没准备好填写,不要提供像null这样的虚拟。而是将对象切换为特征并将成员保留为摘要。