被"Scala in Depth"选项示例混淆

cha*_*ium 2 java scala type-inference option

Josh Sueresh撰写的新曼宁着作"Scala in Depth"的第2章发布在这里.在阅读这篇文章时,我遇到了一些代码:

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")))

}
Run Code Online (Sandbox Code Playgroud)

解释上述代码的后续文字如下:

getTemporaryDirectory方法将命令行参数作为包含String的Option,并返回引用我们应该使用的临时目录的File对象.我们要做的第一件事是使用Option上的map方法创建一个java.io.File(如果有参数).接下来,我们确保这个新构造的文件对象是一个目录.为此,我们使用过滤方法.这将检查Option中的值是否遵循某个谓词,如果不是,则转换为None.最后,我们检查选项中是否有值; 否则,我们返回默认的临时目录.

所以,对于我来自Java和学习Scala,代码语法让我很困惑.我不知道map(...)函数调用后面有一个点.似乎有很多类型推断发生,我在某处遗漏某些东西而没有看到类型.

对我来说,学习Scala,能够以某种方式查看所有推断的类型,以取消(或取消应用)所有减少,即看起来类似于Java 6之前的类型具有类似的类型的过于冗长的版本将非常有用.要在集合类的等于两边显示.

是否有任何工具可以采用Scala代码片段并使显式不同的东西(可能作为标志;一个用于类型,另一个用于implicits,另一个用于括号,另一个用于分号).我只需要一些东西让我从完全简洁的代码转到更接近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")));

}
Run Code Online (Sandbox Code Playgroud)

我并没有特别坚持上述内容.我只是无法跟踪链接函数调用如何根据类型推断实际发生的事情.任何有关这方面的帮助将不胜感激.

Pao*_*lla 11

好吧,你确实有REPL一个接一个地尝试链式命令并检查它们的结果类型,但我不确定看到这些签名对你有多大帮助:

scala> Some("c:\\users\\paolo")
res0: Some[java.lang.String] = Some(c:\users\paolo)

scala> res0.map(name => new java.io.File(name))
res1: Option[java.io.File] = Some(c:\users\paolo)

scala> res1.filter(_.isDirectory)
res2: Option[java.io.File] = Some(c:\users\paolo)

scala> res2.getOrElse(new java.io.File(System.getProperty("java.io.tmpdir")))
res3: java.io.File = c:\users\paolo
Run Code Online (Sandbox Code Playgroud)

现在让我们再试一次,从无.开始.

scala> None:Option[String]
res6: Option[String] = None

scala> res6.map(name => new java.io.File(name))
res7: Option[java.io.File] = None

scala> res7.filter(_.isDirectory)
res8: Option[java.io.File] = None

scala> res8.getOrElse(new java.io.File(System.getProperty("java.io.tmpdir")))
res9: java.io.File = C:\Users\paolo\AppData\Local\Temp
Run Code Online (Sandbox Code Playgroud)

所以使用Option帮助我们"传播" None而不检查每一步的空值,就像我们在java中可能做的那样.

如你所见,这里没有发生很多类型推断.我觉得你的困惑的根源可能是map与filter(其中包括)通常关联到某种集合,因此它可能很难神交他们做选择,这是只有远程类似收集什么.为此,我将您推荐给经典的scala.Option备忘单