嗨,我是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)
这是一个错误还是我误解了什么? 非常感谢
答案 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)
的缩写。