以下是我在使用scala book时使用的代码片段。它在框架中运行良好,但是当我尝试在commndline中它会给出错误
error: Product.type does not take parameters
var products = Set(Product(5018206244611L, "Tom", "Zebra"))
以下是我使用的代码
case class Product(ean: Long, name: String, description: String)
object Product {
var products = Set(Product(5018206244611L, "Tom", "Zebra"))
def findAll = products.toList.sortBy(_.ean)
}
在其中一个控制器文件教程中使用Product.apply和Product.unapply。 Product.apply和Product.unapply在未在对象内定义时指示什么,并在我在控制台中键入时给出错误。 FOllowing是使用Product.apply和Product.unapply
的代码private val productForm: Form[Product] = Form(
mapping(
"ean" -> longNumber.verifying(
"validation.ean.duplicate", Product.findByEan(_).isEmpty),
"name" -> nonEmptyText,
"description" -> nonEmptyText)(Product.apply)(Product.unapply)
)
答案 0 :(得分:7)
与“普通”编译相比,Scala REPL(命令行)有一些差异。除了无法定义包之外,另一个主要的是它逐行执行语句。
上述意味着,在Scala REPL中,您使用第二个代码块不创建了一个带有伴随对象的类;相反,您创建了Product
案例类,并使用新的Product
模块将然后“阴影化”了它。
解决方法是在REPL中使用:paste
命令,以便同时输入两个定义。
关于您的第二个问题 - apply
是一种应用方法(您使用foo(...)
调用的内容 - 例如,所有FunctionN
个实例都拥有它),unapply
为{{ 3}}(用于模式匹配 - 案例类用于“免费”)。