Scala Companion对象和Apply方法

时间:2017-10-21 01:47:03

标签: scala

我试图在我的Scala代码中使用此语句:

val dvd1 = Item(new Description("The Matrix DVD", 15.50, "DVD World"))

我有以下类和伴侣对象:

class Item(){
    private var id = 0
    def getId(): Int = this.id
}

object Item{
    def apply(description: String, price: Double, supplier: String): Description = {
        new Description(description, price, supplier)
    }

    def nextId: Int = {
        this.id += 1
    }
}

class Description(description: String, price: Double, supplier: String){
    def getDescription(): String = description
    def getPrice(): Double = price
    def getSupplier(): String = supplier
}

我的apply函数和nextId出现以下错误:

error: not enough arguments for method apply: (description: String, price: Double, supplier: String)Description in object Item.
Unspecified value parameters price, supplier.
    val dvd1 = Item(new Description("The Matrix DVD", 15.50, "DVD World"))
                   ^
indus.scala:16: error: value id is not a member of object Item
        this.id += 1
             ^

我不明白我做错了什么。

问题:我需要使用我的应用功能更改什么才能使dvd1按预期工作。此外,nextId应该在调用Item.nextId时增加项目的ID,那里有什么问题?

1 个答案:

答案 0 :(得分:1)

1)您正尝试访问来自伴侣对象的班级数据,但不能这样做。

scala> case class Order(id: String)
defined class Order

scala> object Order { println(id) }
<console>:11: error: not found: value id
       object Order { println(id) }
                              ^

反向工作,一旦您在课程中导入伴侣对象。

2)当你在同伴中定义apply时,你现在有两个应用函数,一个带有空args ,另一个带有三个args 定义了您要调用的内容。你的args是错误的。

根据您在下面的评论,您希望Item具有Description数据结构,可以使用scala中的不可变类case class

执行以下操作
import scala.util.Random

case class Description(description: String, price: Double, supplier: String)
case class Item(id: Int, description: Description)

object Item {
  def apply(description: String, price: Double, supplier: String): Item = {
    val itemId = Random.nextInt(100)
    new Item(itemId, Description(description, price, supplier))
  }
}


//client code
val dvd1 = Item("The Matrix DVD", 15.50, "DVD World")

assert(dvd1.isInstanceOf[Item])
assert(dvd1.description.description == "The Matrix DVD")
assert(dvd1.description.price == 15.50)
assert(dvd1.description.supplier == "DVD World")

请参阅在线scala编辑器中的代码 - https://scastie.scala-lang.org/prayagupd/P3eKKPLnQYqDU2faESWtfA/4

另请阅读case class explanation