Scala包对象背后的动机

时间:2017-03-26 13:35:30

标签: scala

对象包语法的优点是什么,而不是简单地让函数和变量添加到包中?

示例:

package something {
   def hello = 0
  // other classes and such
}

为什么不简单:

remove_action( 'woocommerce_checkout_order_review', 'woocommerce_checkout_payment', 20 ); 
add_action( 'woocommerce_after_order_notes', 'woocommerce_checkout_payment', 20 );

1 个答案:

答案 0 :(得分:6)

你甚至可以更进一步:当我们有object时,为什么要包装?

Scala旨在用作托管语言",即可以在另一种语言平台上托管的语言。 Scala的原始实现是在Java平台和ISO公共语言基础结构平台上(或者更确切地说是它的主要实现,.NET和Mono)。今天,我们在ECMAScript平台(Scala.js)上也有一个实现,例如,Java平台实现也可以在Android上使用。您可以想象其他有趣的平台,您希望运行Scala,例如Windows UWP平台,Swift / Objective-C / Core Foundation / macOS / iOS / tvOS / watchOS平台,Gnome / GObject平台,Qt / C ++平台等。

Scala不会只是打算在这些平台上运行,它打算实现两个通常相互冲突的目标:

  • 高性能
  • 与" native"紧密集成感觉

因此,在Scala中,实现问题是语言设计的一部分。 (Rich Hickey,Clojure的设计者,曾经在一次演讲中说过,JVM 不是一个实现细节",同样适用于Scala。)一个很好的例子是正确的尾部调用:为了支持正确的尾部调用,Scala必须管理自己的堆栈,而不是在JVM等平台上使用主机平台的本机调用堆栈,但这意味着您无法再轻松地从其他平台调用Scala代码平台上的代码,反之亦然。因此,虽然正确的尾调用很好,但是Scala可以适应不那么强大的正确尾部递归。

理论上,Scala只需要object个,trait个方法,type和路径(.#)。其他所有内容基本上都是为了简化与主机平台的集成。例如,这包括nullclass es和package s。

理想情况下,应该有一个从主机平台构造到Scala构造的简单映射,反之亦然。因此,例如,Scala方法和JVM方法之间存在简单的映射。 JVM接口与仅具有抽象成员的Scala特征之间存在简单的映射。 Scala特征和JVM类之间存在 no 简单映射,这也是Scala具有(冗余)类概念的原因。同样,Scala object和JVM package(或CLI namespace s)之间没有简单的映射,这就是Scala具有{{1}的(冗余)概念的原因。也是。

但是,我们真的就像package一样(毕竟有点像Scala package s)也有成员。但是JVM object和CLI package不能拥有namespaceinterface以外的成员,因为我们只在Scala中引入了它们以便与主机平台通过向主机平台添加成员来使它们与主机平台不兼容是没有意义的。

因此,我们引入了另一个单独的概念class,该概念包含我们想要添加到package object的成员但由于主机平台的互操作性而无法添加。

<强> TL;博士

  • 我们有package因为互操作(即使我们已经有package s,它可以做与object s相同的事情。
  • 我们希望package有成员
  • package s不能拥有成员,因为互操作
  • 所以,我们package作为package object s
  • 的伴侣