给定这个(极其简化的)代码:
@optics
data class MigrationStatus(val token: String?)
val m = MigrationStatus(null)
我可以打电话
val m1 = MigrationStatus.token.modify(m) { "some token" }
但是由于参数类型是不可为空的String
,我怎样才能token
修改回null
?答案是肯定的
val m2 = MigrationStatus.token.modify(m1) { null }
不编译。
尝试将其设置为None
时token
类型更改为Option<String>
时也会发生同样的情况,但我避免使用它,因为它现在已被弃用(我不确定我是否喜欢,但那是另一回事)。
我错过了一些明显的东西吗?
@Optics
编译器为该属性生成 2 个光学器件。
MigrationStatus.token
&MigrationStatus.tokenNullable
或MigrationStatus.tokenOption
在Option
的情况下。
这是因为有两种不同的Optics
在这里很有用。
Lens
具有set
和get
,在本例中为"Lens<MigrationStatus,String?>Optional
具有set
和getOption
,在本例中为"可选<迁移状态,字符串>
第一个是您要在这种情况下使用的那个 能够String?
设置为null
.
所以MigrationStatus.tokenNullable.set(null)
.
后者对于DSL和光学组合更有用,因为如果您没有String?
另一个数据类或密封类,则仅在非空的情况下才希望对该值进行操作。
我希望这完全回答了你的问题!