0

鉴于此(极其简化)代码:

@optics
data class MigrationStatus(val token: String?)

val m = MigrationStatus(null)

我可以打电话

val m1 = MigrationStatus.token.modify(m) { "some token" }

但是由于参数类型是不可为空的String,我该如何修改tokennull?当然

val m2 = MigrationStatus.token.modify(m1) { null }

不编译。

尝试将其设置为时将token类型更改为时也会发生同样的情况,但我避免使用它,因为它现在已被弃用(我不确定我是否喜欢,但这是另一回事)。Option<String>None

我错过了什么明显的东西吗?

4

1 回答 1

3

编译器@Optics为该属性生成 2 个光学器件。

MigrationStatus.token&MigrationStatus.tokenNullableMigrationStatus.tokenOption在 的情况下Option

这是因为这里有两个不同Optics的地方有用。

  • Lens其中有set&get在这种情况下是 `Lens<MigrationStatus, String?>
  • Optional其中有set&getOption在这种情况下是 `Optional<MigrationStatus, String>

第一个是您想要在这种情况下使用的,以便能够设置String?null.

所以MigrationStatus.tokenNullable.set(null)

后者对于 DSL 和 Optics 的组合更有用,因为如果不是String?您有另一个数据类或密封类,您只想在非空的情况下对该值进行操作。

我希望这完全回答了你的问题!

于 2020-12-10T13:41:23.160 回答