【发布时间】:2012-04-04 08:30:15
【问题描述】:
由 Josh Sueresh 撰写的 Manning 新书“深入 Scala”的第 2 章发布在 here。在阅读文章时,我遇到了这段代码:
def getTemporaryDirectory(tmpArg : Option[String]) : java.io.File = {
tmpArg.map(name => new java.io.File(name)).
filter(_.isDirectory).
getOrElse(new java.io.File(System.getProperty("java.io.tmpdir")))
}
解释上述代码的后续文字如下:
getTemporaryDirectory 方法将命令行参数作为 一个包含字符串的选项并返回一个文件对象引用 我们应该使用的临时目录。我们做的第一件事是使用 选项上的 map 方法来创建一个 java.io.File 如果有 范围。接下来,我们确保这个新构造的文件对象 是一个目录。为此,我们使用过滤器方法。这将检查 Option 中的值是否遵守某个谓词,如果不是, 转换为无。最后,我们检查一下我们是否有一个值 选项;否则,我们返回默认的临时目录。
所以,对于来自 Java 并学习 Scala 的我来说,代码语法让我感到困惑。我不明白 map(...) 函数调用之后如何有一个点。似乎发生了太多类型推断,我在某处遗漏了一些东西并且没有看到类型。
这对我学习 Scala 非常有帮助,能够以某种方式查看所有推断类型,取消推断(或取消应用)所有缩减,即看起来像 Java 6 之前的过于冗长的版本对于集合类,类型必须在等号的两边都显式。
是否有任何工具可以使用 Scala 代码 sn-p 并做出明确的不同事物(可能作为标志;一个用于类型,另一个用于隐式,另一个用于大括号,另一个用于分号)。我只需要一些东西来将我从完全简洁的代码引导到更接近 Java 的东西,这样我就可以自信地培养我阅读(并最终编写)更简洁的 Scala 的技能。
这是我要找的东西:
def getTemporaryDirectory(tmpArg : Option[String]) : java.io.File = {
ContainerType1[Type1] t1 = tmpArg.map(name => new java.io.File(name));
ContainerType2[Type2] t2 = t1.filter(_.isDirectory);
return t2.getOrElse(new java.io.File(System.getProperty("java.io.tmpdir")));
}
我并没有特别拘泥于上述内容。由于类型推断,我只是无法理解链式函数调用是如何工作的。对此的任何帮助将不胜感激。
【问题讨论】:
-
这篇文章提出了一个类似于我上面遇到的挑战的观点:zeroturnaround.com/blog/scala-sink-or-swim-part-1
-
在这个级别上,您将从 Odersky 等人的 Programming in Scala 中受益比从 Suereth 的 Scala in Depth 中受益更多。只是说。
-
This post 和漂亮的动画可能会给你更多的感觉
-
@Daniel 根据您的建议,我现在正在重读 Odersky 的书(第 2 版)。事实证明,这对我来说是一个很好的建议。我第一次从中得到了很多。现在一年后重新阅读它,我看到我第一次错过了多少。我现在正在使用 REPL 来玩本书中的示例。我认为我需要在 REPL 中真正“玩”一些更“抽象”的东西,而这些东西我不会仅仅“阅读”。感谢电子阅读器。我的手机、笔记本电脑、平板电脑和工作计算机上都有它。 :)
-
@chaotic3quilibrium 很高兴能帮上忙。
标签: java scala option type-inference