gpt4 book ai didi

scala - Option 包装一个值是一个好的模式吗?

转载 作者:行者123 更新时间:2023-12-04 01:22:32 25 4
gpt4 key购买 nike

我最近编写了以下 Scala 代码:

val f: File = ... // pretend this file came from somewhere
val foo = toFoo(io.Source.fromFile(f).mkString)

我真的不喜欢这种流动的方式。要了解发生了什么,您必须从 f 开始在中间,向左阅读 fromFile , 向右阅读 mkString ,再次向左阅读 toFoo .啊。

特别是在习惯了序列的功能转换之后,这很难阅读。我的下一次尝试如下所示:
val foo = Some(f)
.map(io.Source.fromFile)
.map(_.mkString)
.map(toFoo)
.get

我更喜欢这种流动。你可以看看发生了什么 Option这是一个很好的用法吗?类(class)?还是我滥用了?有没有更好的模式可以用来实现相同的流程?

最佳答案

这完全没问题。但是,有一个方法|>Scalaz这样做更好,如果您不想要所有 Scalaz,您可以自己创建它:

class Piper[A](a: A) { def |>[B](f: A => B) = f(a) }
implicit def pipe_everything[A](a: A) = new Piper(a)

f |> io.Source.fromFile |> {_.mkString} |> toFoo

就我个人而言,我倾向于编写大量需要括号的代码,并且在大多数情况下我更喜欢方法而不是运算符,因此在我的代码中我通常调用 |> “使用”,但这是相同的交易:
f.use(io.Source.fromFile).use(_.mkString).use(toFoo)

在 Scala 2.11 或更高版本中,您可以使用(稍微)更少的语法获得相同的行为和改进的性能:
implicit class Piper[A](private val a: A) extends AnyVal {
def |>[B](f: A => B) = f(a)
}

关于scala - Option 包装一个值是一个好的模式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4889281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com