我正在阅读"Functional“,它描述了使用注释生成透镜的过程。
@透镜
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注释中找到任何其他材料,所以我想知道这是否是一个不推荐的实现。
我的预感是正确的还是我在这里遗漏了什么?
发布于 2018-08-12 16:00:46
你的问题其实就是答案。注释被重命名。
正如我所记得的那样,注释已经存在,并且是"kategory“的试验性添加(库从此被重命名为”箭头“)。当它出现时,我找不到提交,因为库重新组织了很多次。但我相信当它改名时,这是一个没有文件记载的高度实验性的特性。
那是这本书作者的错吗?我没有读过它,但是这个特性对于kotlin开发人员来说非常有趣和透视图,尽管这是非常实验性的。
为什么改名
“光学”是比“透镜”更通用的术语。当它开始的时候,只有透镜(和部分棱镜)。目前,光学包括:透镜,伊索,遍历,折叠,棱镜,吸气剂,设置器。你可以在文档中找到更多的信息。我肯定那本书是个不错的来源,尽管它已经过时了。“箭博士”非常初学者友好,不像其他许多不同语言的镜头-libs。
https://stackoverflow.com/questions/51571072
复制相似问题