我试图在我的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,那里有什么问题?
答案 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