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

scala中用于表达式的函数文本,scala,Scala,嗨,我是scala的新手,有个问题 当我在for循环中指定函数文字的非缩写版本时,scala对其不做任何处理 e、 g val myList=List(“一”、“二”、“树”、“四”、“五”) //编译但不打印任何内容 对于(arg{println(arg)} //是否在单独的行上打印一、二、树、四、五 lst.foreach((arg:String)=>{println(arg)}) 另一方面,for循环中上述函数literal(println(arg))的缩写版本似乎与预期的一样工作:

嗨,我是scala的新手,有个问题

当我在for循环中指定函数文字的非缩写版本时,scala对其不做任何处理

e、 g

val myList=List(“一”、“二”、“树”、“四”、“五”)
//编译但不打印任何内容
对于(arg{println(arg)}
//是否在单独的行上打印一、二、树、四、五
lst.foreach((arg:String)=>{println(arg)})
另一方面,for循环中上述函数literal(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)
val myList=List(“一”、“二”、“树”、“四”、“五”)
//是否在单独的行上打印一、二、树、四、五

对于(arg,它不是Scala中的错误。当您指定函数时,如下所示:

for (arg <- lst) (arg:String) => {println(arg)}
其内容如下:“对于
lst
中的每个元素,声明此函数并使用
arg
调用它。”

请注意与foreach的区别:

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

这意味着:“调用<代码> PROACH <代码> >代码> LST,并传递该函数“-<代码> Furace,然后调用<代码> LST中的每个元素的函数。

更多的旁注,请考虑此

val a = for (arg <- lst) (arg:String) => {println(arg)}
a: Unit = ()
在这里,我们告诉理解者将一组函数从
字符串
传递到
单元
(由于
println
)。然后我们可以将
lst
中的每个条目应用到
b
中的每个对应函数,例如

(lst zip b).foreach { case (s, f) => f(s) }
one
two
tree
four
five

请注意,
f(s)
f.apply(s)

的简写,但请记住,
((arg:String)=>{println(arg)})(arg)
是对一切的巨大浪费,而
println(arg)
也有同样的作用,而且可读性更强。这当然只是为了展示语言的工作原理。编写
lst.foreach(println)
做同样的事情,可读性和效率更高。非常感谢Jesper给出了这个清晰的答案。我同意((arg:String)=>{println(arg)})(arg)是一种浪费,但我尝试过学习语言的基本原则:-)肯定不会比命令式方法更有效,因为foreach使用的函数对象需要匿名类和构造开销。
val a = for (arg <- lst) (arg:String) => {println(arg)}
a: Unit = ()
val b = for (arg <- lst) yield (arg:String) => {println(arg)}
b: List[String => Unit] = List(<function1>, <function1>, <function1>, <function1>, <function1>)
(lst zip b).foreach { case (s, f) => f(s) }
one
two
tree
four
five