Scala中的匿名函数和映射

Von*_*onn 2 scala

我不确定为什么这不起作用:

scala> case class Loader(n: String, x: String, l: List[String])
scala> val m: Map[String, (List[String])=>Loader] = 
     | Map("x" -> Loader("x", "x1", _:List[String]))              

<console>:8: error: type mismatch;
 found   : (List[String]) => (java.lang.String, Loader)
 required: (String, (List[String]) => Loader)
       Map("x" -> Loader("x", "x1", _:List[String]))
Run Code Online (Sandbox Code Playgroud)

但这样呢?

scala> Loader("t", "x", _:List[String])
res7: (List[String]) => Loader = function1>

scala> val m = Map("x" -> res7)
m: scala.collection.immutable.Map[java.lang.String,(List[String]) => Loader] =
  Map((String,function1>))
Run Code Online (Sandbox Code Playgroud)

Dan*_*ral 5

另一个_Scala 超载的受害者.考虑一下:

f(_, 5) + 1 // Partial function application
f(_ + 1, 5) // Closure
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,_正在替换整个参数.在这种情况下,它代表部分应用f.在实践中,它等同于x => f(x, 5) + 1,因为包含 的整个表达式f变成了一个闭包.

在第二种情况下,_是表达式的一部分.在这种情况下,整个表达式变成一个闭包,直到任何表达式分隔符 - 我的意思是,如果表达式嵌套在另一个表达式中,则只有内部表达式变为闭包.在实践中,它相当于f(x => x + 1, 5).