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