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.tokenNullable
或 MigrationStatus.tokenOption
Option
.
这是因为有两个不同的Optics
在这里很有用。
Lens
其中有 set
& get
在这种情况下,`Lens
Optional
其中有 set
& getOption
在这种情况下,`Optional
第一个是您在这种情况下想要使用的那个,以便能够将 String?
设置为 null
。
所以MigrationStatus.tokenNullable.set(null)
.
后者对于 DSL 和 Optics 的组合更有用,因为如果不是 String?
你有另一个数据 class 或密封的 class 你想要操作仅在not-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.tokenNullable
或 MigrationStatus.tokenOption
Option
.
这是因为有两个不同的Optics
在这里很有用。
Lens
其中有set
&get
在这种情况下,`LensOptional
其中有set
&getOption
在这种情况下,`Optional
第一个是您在这种情况下想要使用的那个,以便能够将 String?
设置为 null
。
所以MigrationStatus.tokenNullable.set(null)
.
后者对于 DSL 和 Optics 的组合更有用,因为如果不是 String?
你有另一个数据 class 或密封的 class 你想要操作仅在not-null情况下的值。
我希望能完全回答您的问题!