scala中用于表达式的函数文字

时间:2015-02-22 12:57:03

标签: scala

嗨,我是scala的新手并且有一个问题。

当我在for循环中指定一个函数文字的非缩写版本时,scala对它没有任何作用。

e.g。

    val myList = List("one","two","tree","four","five")
    //compiles but does not print anything
   for (arg <- lst) (arg:String) => {println(arg)}

    //does print one, two, tree, four,five on separated lines
   lst.foreach((arg:String) => {println(arg)})

另一方面,for循环中上述函数文字(println(arg))的缩写版似乎按预期工作:

    val myList = List("one","two","tree","four","five")
    //does print one, two, tree, four,five on separated lines
    for (arg <- lst) println(arg)

这是一个错误还是我误解了什么? 非常感谢

2 个答案:

答案 0 :(得分:4)

这不是Scala中的错误。指定函数时,如下所示:

for (arg <- lst) (arg:String) => {println(arg)}

然后Scala确实没有对它做任何事情,因为你只指定了这个函数 - 你没有告诉Scala实际调用该函数。您的for循环基本上意味着:“对于lst中的每个元素,声明此函数”。

您必须指定要调用该函数:

for (arg <- lst) ((arg:String) => {println(arg)})(arg)

其内容如下:“对于lst中的每个元素,声明此函数并使用arg调用它。”

请注意与foreach的区别:

lst.foreach((arg:String) => {println(arg)})

这意味着:“在foreach上致电lst,然后将此功能传递给他人” - foreach然后调用lst中每个元素的函数。< / p>

答案 1 :(得分:1)

更多的旁注,请考虑这个

val a = for (arg <- lst) (arg:String) => {println(arg)}
a: Unit = ()

类型a的{​​{1}}什么都不做,

Unit

我们告诉理解,将val b = for (arg <- lst) yield (arg:String) => {println(arg)} b: List[String => Unit] = List(<function1>, <function1>, <function1>, <function1>, <function1>) 的一系列函数传递到String(由于Unit)。然后我们可以将println中的每个条目应用到lst中的每个相应函数,例如像这样,

b

请注意,(lst zip b).foreach { case (s, f) => f(s) } one two tree four five f(s)的缩写。