gpt4 book ai didi

使用 Squeryl 的持久存储中的 Scala 不变性

转载 作者:行者123 更新时间:2023-12-04 05:38:30 25 4
gpt4 key购买 nike

所以当我阅读 Play for Scala本书,我遇到了书中解释的一些奇怪的事情。这是相关的片段:

There's something strange going on, though. If you're using immutable classes—which vanilla case classes are—you might be worried when you discover that Squeryl updates your object's supposedly immutable id field when you insert the object. That means that if you execute the following code,

val myImmutableObject = Product(0, 5010255079763,
"plastic coated blue", "standard paperclip, coated with blue plastic")
Database.productsTable.insert(myImmutableObject)
println(myImmutableObject)

the output will unexpectedly be something like: Product(13,
5010255079763, "plastic coated blue", "standard paperclip, coated with
blue plastic")
. This can lead to bad situations if the rest of your code expects an instance of one of your model classes to never change. In order to protect yourself from this sort of stuff, we recommend you change the insert methods we showed you earlier into this:

def insert(product: Product): Product = inTransaction {
val defensiveCopy = product.copy
productsTable.insert(defensiveCopy)
}

我的问题是,鉴于产品类别是这样定义的:

import org.squeryl.KeyedEntity

case class Product(
id: Long,
ean: Long,
name: String,
description: String) extends KeyedEntity[Long]

Database 对象定义如下:

import org.squeryl.Schema
import org.squeryl.PrimitiveTypeMode._
object Database extends Schema {
val productsTable = table[Product]("products")
...

on(productsTable) { p => declare {
p.id is(autoIncremented)
}}
}

那么声明为 val 的案例类怎么可能更改其字段之一呢? Squeryl 是在使用某种反射来改变字段还是这本书以某种方式弄错了?

我无法运行示例来验证可能是什么情况,但是使用过 Squeryl 的人也许可以给出答案?

最佳答案

你可以自己查看table方法的定义:

https://github.com/squeryl/squeryl/blob/master/src/main/scala/org/squeryl/Schema.scala#L345

这是一个通用函数,它使用反射来实例化绑定(bind)到给定案例类的 Table 对象。函数在 Scala 中是一等公民,所以它们可以像其他任何东西一样被分配给一个 val。

最后一个片段也是一个异步函数,它将给定的参数映射到为其定义的一些修改。

关于使用 Squeryl 的持久存储中的 Scala 不变性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43793199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com