我正在阅读“功能性Kotlin”,其中描述了使用注释生成镜片的过程。
import arrow.lenses
import arrow.optics.Lens
import arrow.optics.modify
typealias GB = Int
@lenses data class Memory(val size: GB)
@lenses data class MotherBoard(val brand: String, val memory: Memory)
@lenses data class Laptop(val price: Double, val motherBoard: MotherBoard)
fun main(args: Array<String>) {
val laptopX8 = Laptop(500.0, MotherBoard("X", Memory(8)))
val laptopMemorySize: Lens<Laptop, GB> = laptopMotherBoard() compose
motherBoardMemory() compose memorySize()
val laptopX16 = laptopMemorySize.modify(laptopPrice().set(laptopX8, 780.0)) { size ->
size * 2
}
println("laptopX16 = $laptopX16")
}
Arrow生成与我们的数据类具有的构造函数参数一样多的镜头,并且
名称约定classProperty
并在同一包中,因此没有多余的导入
需要
但是当我尝试使用@lenses
注释时,找不到它。
在Arrow文档中,我注意到他们使用了@optics
批注
@optics data class Memory(val size: GB) {
companion object
}
这将创建一个Memory.Companion.size
镜头。
由于我无法在@lenses
注释中找到任何其他材料,所以让我想知道这是否可能是不推荐使用的实现。
我的直觉是正确的还是我在这里缺少什么?
答案 0 :(得分:2)
您的问题实际上是答案。注释已重命名。
据我所知,注释存在并且是“类别”的实验性添加(此后库被重命名为“箭头”)。由于库已多次重组,因此在出现提交时找不到提交。但是我敢肯定,在重命名时,它是未记录的且具有高度实验性的功能。
那是本书作者的错吗?我没有读过它,但是该功能对于kotlin开发人员来说非常有趣且具有远见,尽管那是高度实验性的。
名称更改的原因
“光学”比“透镜”更笼统。当它开始时,只有镜头(和部分棱镜)。目前,光学器件包括:镜头,Iso,遍历,折叠,棱镜,吸气剂,塞特镜。您可以在文档中找到更多信息。在两者之间,我确信这本书虽然过时了,但却是不错的来源。 The Arrows Docs非常适合初学者,这与许多其他使用不同语言的镜头库不同。