【问题标题】:When should I use package and when object in Scala?我应该什么时候使用包,什么时候在 Scala 中使用对象?
【发布时间】:2023-04-10 10:54:01
【问题描述】:

包和对象有什么区别?

【问题讨论】:

    标签: scala object package scala-2.8


    【解决方案1】:

    包不是运行时实体,对象是。您应该使用包来组织代码的层次结构,并在需要存储代码或数据时使用对象(当然,假设普通的类和实例并不好)。

    【讨论】:

      【解决方案2】:

      Daniel's answer加一点:

      来自Scala specifications

      对象

      类(第 5.3 节)和对象(第 5.4 节)都是根据模板定义的。
      模板定义特征或对象类或单个对象的类型签名、行为和初始状态。

      它可以有:

      • 局部修饰符('abstract'、'final'、'sealed'、'implicit'、'lazy')
      • 访问已修改(‘private’|‘protected’),
      • 访问限定符('this')

      对象定义定义了一个符合模板 t 的新类的单个对象(或:模块)。
      它大致相当于以下三个定义,它们加在一起 定义一个类并按需创建该类的单个对象:

      final class m$cls extends t
      private var m$instance = null
      final def m = {
        if (m$instance == null) m$instance = new m$cls
        m$instance
      }
      

      一个对象可以隔离其他Class实例通用的代码。具体用法:

      Scala 中的类没有静态成员;但是,可以通过附带的对象定义来实现等效的效果。
      一般来说,一个类的伴生模块是一个与该类同名并定义在相同作用域和编译单元中的对象
      反之,该类称为模块的伴生类


      包是编译单元的一部分。

      一个编译单元由一系列包装、导入子句和类组成 和对象定义,前面可能有一个包子句。

      包是一个特殊的对象,它定义了一组成员类、对象和 包。

      与其他对象不同,包不能用作值。拥有与模块或类具有相同完全限定名称的包是非法的。
      假设包装外的顶级定义被注入到一个特殊的 空包。该包无法命名,因此无法导入。

      特殊的预定义名称_root_ 指的是最外层的根包 包含所有顶级包。


      所以:

      • 对象组织代码从唯一的运行时实例执行。
      • 为编译步骤打包声明代码命名空间。

      【讨论】:

      • 这不是对包对象的描述吗?我对常规包和常规对象之间的区别感兴趣。
      • @Łukasz:对,昨天很晚;)丹尼尔的回答是正确的。我刚刚从 Scala 规范中添加了一些元素。
      猜你喜欢
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      • 1970-01-01
      • 2015-05-19
      • 1970-01-01
      • 2012-09-22
      • 1970-01-01
      • 2010-12-30
      相关资源
      最近更新 更多