【发布时间】:2018-06-16 16:32:14
【问题描述】:
我正在修改 Try,根据这个:
val files = Stream("a.txt", "b.txt", "c.txt")
files
.map(s => Try(Source.fromFile(s)))
.flatMap(t => t match {
case Failure(x) =>
Console.err.println(s"Failure: x.getMessage")
Stream.Empty
case Success(s) => Stream(s)
})
.flatMap(t => t.getLines.toStream)
.foreach(println)
虽然它可以正常工作,但正如我希望/预期的那样,我有一种不安的感觉,我无法确定“Source.fromFile(s)”部分实际上是如何被评估的。 Try.apply 方法的参数记录为按名称参数,因此显然必须强制对其进行评估。
但是,在我看来,下一个操作将是“t 匹配”部分,即查看 Try.apply 创建的对象类型,如果对象没有,则无法工作已创建,并且在不评估要应用的参数的情况下无法创建它。在这种情况下,我首先看不出这个论点有任何意义。
或者,也许案例类的行为本质上是惰性的?或者,也许我只是遗漏了一些明显的东西。
有人介意为我澄清一下吗?
【问题讨论】:
标签: scala pass-by-name