xle*_*ier 1 functional-programming kotlin arrow-kt
给出这个(极其简化的)代码:
@optics
data class MigrationStatus(val token: String?)
val m = MigrationStatus(null)
Run Code Online (Sandbox Code Playgroud)
我可以打电话
val m1 = MigrationStatus.token.modify(m) { "some token" }
Run Code Online (Sandbox Code Playgroud)
但由于参数类型是不可为空的String,我怎样才能修改token回呢null?当然
val m2 = MigrationStatus.token.modify(m1) { null }
Run Code Online (Sandbox Code Playgroud)
不编译。
当尝试将其设置为 时将token类型更改为 an时,也会发生同样的情况,但我避免了它,因为它现在已被弃用(我不确定我喜欢,但那是另一回事)。Option<String>None
我错过了一些明显的事情吗?
编译@Optics器为该属性生成 2 个光学器件。
MigrationStatus.token&MigrationStatus.tokenNullable或MigrationStatus.tokenOption在 的情况下Option。
这是因为这里有两个不同的Optics有用之处。
Lens其中有set& get,在本例中为 `Lens<MigrationStatus, String?>Optional其中有set& getOption,在本例中为 `Optional<MigrationStatus, String>第一个是您在本例中想要使用的,以便能够设置String?为null。
所以MigrationStatus.tokenNullable.set(null)。
后者对于 DSL 和光学组合更有用,因为如果String?您没有另一个数据类或密封类,您只想在非空的情况下对值进行操作。
我希望完全回答您的问题!