2012-07-28 67 views
8

看完Martin's keynote on Reflection and Compilers后,我似乎无法把这个疯狂的问题从我脑海中解开。马丁谈论了其中一些关于“(婚礼)蛋糕模式”的内容,其中特质扮演着核心角色。我想知道,为什么在我们已经有特质的时候我们需要包装?有没有什么是package可以做,什么trait(至少在理论上)不能?性格与斯卡拉的软件包

我不是在谈论当前的实现,我只是试图想象如果我们用特征替换包,编程会是什么样子。在我的头它会是这样:

  • 一个关键字以下(package是不需要的)
  • 不需要package object小号

总结我所有的问题:

  1. 是理论上可以从语言中删除包并使用特征。
  2. 我们从这种改变中能获得什么其他好处? (我正在考虑一流的软件包和一流的导入,但mixin的构成是编译时的事情,虽然超级调用是动态绑定的)
  3. 是Java/JVM兼容性唯一的东西,它会阻碍?

更新

this keynote丹尼尔Spiewak谈到了依赖注入是所有你可以用蛋糕图案做的东西只是冰山的顶端。

+0

这只是(静态)[newspeak](http://newspeaklanguage.org/)! :) – 2012-08-07 20:55:37

回答

7

马丁奥德斯基曾说过,斯卡拉可以通过只有特质,物体,方法和路径(我希望我没有忘记的东西)。

两个类和包就在那里,因为Scala旨在托管语言,即运行在一个语言(这实际上是不感兴趣的位)和(这是很重要的一点)主机互操作平台。一些Scala旨在与之互操作的主机平台是Java平台和CLI,它们都具有类和包的概念(在CLI的情况下是命名空间),这些概念明显不同,不能简单地表达为性状或物体。这与接口不同,它可以简单地映射到纯抽象特征上,也可以从纯抽象特征映射出来。

上述声明是在关于可能从Scala中删除泛型的讨论中作出的,因为所有泛型都可以通过抽象类型实现。

+0

所以你说它实际上在理论上是可行的,但是不值得实施它,因为我们中的任何一个都不是能够想象它实际上会向我们购买什么;) – agilesteel 2012-07-30 09:33:13

+0

它会购买语言的显着简化,而且由于简单性是Scala的主要目标之一,所以它绝对有意义。它将失去主机平台的互操作性,然而,这是Scala的另一个主要目标。您可以在所有使用包的情况下使用对象,但没有干净的方式将Scala对象映射到Java包或CLI命名空间。接口的情况是不同的:完全抽象的特征和接口之间存在明显的映射关系,因此,Scala可以与Java/CLI接口进行互操作,而不需要它们在语言中。 – 2012-08-07 01:18:14

6

在scala中,对象和包的功能几乎相同,对象也称为模块。对象值得被认为是模块,因为它们可以包含任何定义,包括其他对象,当然也包括类型。

一个特质可以被认为是一个抽象模块。它可以包含任何定义,并且任何成员都可以是抽象的,包括显着的类型成员。我吟诵这一切只是为了突出对称性。也许旧金山,但对我来说,特征似乎是物联网和功能性思想融合在一起,在scala方面的创新。

到最后给出一个答案:

  1. 我想包可以支持对象(未性状)的去除。
  2. 好处将是一个简化 - 包对象不需要明确定义。
  3. 我认为软件包与用于Java/JVM兼容性的对象是不同的。

更多评论:在视频中,马丁谈论特征(抽象模块)不仅仅是具体模块,因为后者只是在最后时刻才汇编和表达抽象模块的组合。

即使不“混合蛋糕”,也可以使用抽象模块。例如当草拟出一些代码时,您可以定义一个模块来包含定义。但是一旦你找到一种类型或者价值,你就没有准备好填写,不要提供一个诸如null的虚拟物。相反,请将对象切换为特征并保留成员摘要。

+0

什么是“OT”?作为旁注,有一个很好的''''函数,它会为您尚未准备好写入的实现抛出一个'NotImplementedError',我相信使用它比对程序执行任何结构更改要方便得多。 – 2012-07-30 09:34:07

+0

对不起,OT =关闭主题。是的虽然不是类型,但是可以在“素描”中填写值。 – 2012-07-30 11:47:28

+0

性格在Scala之前就发明了,http://scg.unibe.ch/archive/papers/Scha03aTraits.pdf – iwein 2013-03-03 12:06:55