Arrow lens 不允许我将可为 null 的 属性 设置为 null

Arrow lens won't let me set a nullable property to null

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

@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 }

不编译。

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

我是不是漏掉了一些明显的东西?

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

MigrationStatus.token & MigrationStatus.tokenNullableMigrationStatus.tokenOption Option.

这是因为有两个不同的Optics在这里很有用。

  • Lens 其中有 set & get 在这种情况下,`Lens
  • Optional 其中有 set & getOption 在这种情况下,`Optional

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

所以MigrationStatus.tokenNullable.set(null).

后者对于 DSL 和 Optics 的组合更有用,因为如果不是 String? 你有另一个数据 class 或密封的 class 你想要操作仅在not-null情况下的值。

我希望能完全回答您的问题!