2

Programming in Scala 中,我们知道这foreach是一个高阶函数,它接受一个带有返回类型的过程Unit。所以我认为下面的切片可以工作:

val abcde = List("a","b","c","d","e")
abcde.foreach(print _.toUpperCase)

但是它告诉我:

1: error: ')' expected but '.' found.
  abcde foreach (println _.toUpperCase)
                          ^

但是下面这两个都很好用:

println("abcde".toUpperCase)
abcde.foreach(print _)

那么有什么区别呢?

4

2 回答 2

3

这两个_以不同的方式使用:

abcde.foreach(print _.toUpperCase)
abcde.foreach(print _)

在第一种情况下,您有一个匿名函数,其中_表示参数的占位符。

在第二种情况下,_意味着您想要该方法的函数值print(一个eta 扩展)。

所以比较两者是无关紧要的。

更重要的是:

scala> print "abcde".toUpperCase
<console>:1: error: ';' expected but string literal found.
       print "abcde".toUpperCase
             ^

如您所见,这不起作用,因此替换"abcde"_也不起作用。

于 2012-06-05T22:18:50.293 回答
2

你不能_在这种情况下使用,因为

abcde.foreach(print _.toUpperCase)

不能解释为

abcde.foreach((print _).toUpperCase)
              ^       ^

(因为print返回Unit)并且它不能被解释为

abcde.foreach(print (_.toUpperCase))
                    ^             ^

因为print没有从字符串到字符串的函数。

你必须做的时间稍长一些

abcde.foreach(s => print(s.toUpperCase))

效果很好。

[...]但是下面这两个都很好用:[...]

两个都

println("abcde".toUpperCase)

abcde.foreach(print _)

是非常好的和标准的编写方式。不同之处在于,_不能在您的第一次尝试说明的参数中使用它。

于 2012-06-05T14:44:37.200 回答