Scala中的特征与包

agi*_*eel 8 scala namespaces traits package

看完马丁关于反思和编纂的主题演讲后,我似乎无法从头脑中得到这个疯狂的问题.马丁谈到了"(婚礼)蛋糕模式",其中特质扮演着核心角色.我想知道,为什么在世界上我们需要包装时我们已经有了特征?有什么package可以做的,什么trait(至少在理论上)不能?

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

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

总结我的所有问题:

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

更新

Daniel Spiewak在这个关于依赖注入的主题演讲中谈到了使用Cake Pattern可以做的所有事情的冰山一角.

Jör*_*tag 7

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

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

上面的陈述是在讨论可能从Scala中删除泛型的过程中做出的,因为泛型可以做的所有事情也可以通过抽象类型来实现.


Arn*_*Vos 6

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

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

最后给出答案:

  1. 我认为可以删除包以支持对象(而不是特征).
  2. 好处是简化 - 不需要明确定义包对象.
  3. 我认为包与Java/JVM兼容性的对象不同.

更多评论:在视频中,马丁谈论的特征(抽象模块)不仅仅是具体的模块,因为后者只是出现在最后时刻才能汇集和统一抽象模块的某些组合.

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