我知道我可以通过调用来获取当前正在执行的光纤的 ID
ZIO.descriptor.map(_.id)
但是,我想要的是一个不纯的函数,我可以从副作用代码中调用它,让我们像这样定义它
def getCurrentFiberId(): Option[FiberId]
因此
for {
fiberId <- ZIO.descriptor.map(_.id)
maybeId <- UIO(getCurrentFiberId())
} yield maybeId.contains(fiberId)
产生真实。是否可以定义这样的函数,如果可以,如何定义?请注意,这个问题与如何在 ZIO 中从副作用代码访问光纤本地数据密切相关。
不可能。该信息包含在一个名为FiberContext
的类的实例中,该类实际上是负责解释效果的ZIO Runtime
的核心。
此外,此类是内部实现,可以理解地打包私有。
此外,它不仅有一个实例,而且每次unsafeRun
效果时都有一个实例,每次解释fork
时还有一个实例。
由于效果的执行未绑定到线程,因此不使用ThreadLocal
,因此没有希望以某种方式以您想要的方式提取该信息。