包对象

作者: 达微 | 来源:发表于2019-05-09 15:39 被阅读4次

    包对象
    Scala提供包对象作为在整个包中共享的方便容器。

    包对象可以包含任意定义,而不仅仅是变量和方法定义。例如,它们经常用于保存包范围类型的别名和隐式转换。包对象甚至可以继承Scala类和特征。

    按照惯例,包对象的源代码通常放在一个名为的源文件中package.scala。

    每个包都允许有一个包对象。放置在包对象中的任何定义都被视为包本身的成员。

    见下面的例子。首先假设包中有一个类Fruit和三个Fruit对象 gardening.fruits:

    // in file gardening/fruits/Fruit.scala
    package gardening.fruits
    
    case class Fruit(name: String, color: String)
    object Apple extends Fruit("Apple", "green")
    object Plum extends Fruit("Plum", "blue")
    object Banana extends Fruit("Banana", "yellow")
    

    现在假设您要将变量planted和方法showFruit直接放入包中gardening.fruits。这是如何做到的:

    // in file gardening/fruits/package.scala
    package gardening
    package object fruits {
      val planted = List(Apple, Plum, Banana)
      def showFruit(fruit: Fruit): Unit = {
        println(s"${fruit.name}s are ${fruit.color}")
      }
    }
    

    作为使用网站的外观,下面的对象一个例子PrintPlanted进口planted,并showFruit在它到底进口类的方法相同Fruit,使用上包gardening.fruits通配符导入:

    // in file PrintPlanted.scala
    import gardening.fruits._
    object PrintPlanted {
      def main(args: Array[String]): Unit = {
        for (fruit <- fruits.planted) {
          showFruit(fruit)
        }
      }
    }
    

    包对象与其他对象类似,这意味着您可以使用继承来构建它们。例如,人们可能会混合几个特征:

    package object fruits extends FruitAliases with FruitHelpers {
      // helpers and variables follows here
    }
    

    请注意,方法重载在包对象中不起作用。

    https://docs.scala-lang.org/tour/package-objects.html

    相关文章

      网友评论

        本文标题:包对象

        本文链接:https://www.haomeiwen.com/subject/hrgwoqtx.html