我不确定为什么这不起作用:
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]))
但是这样做了?
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>))
答案 0 :(得分:5)
Scala中_
超载的另一个受害者。考虑一下:
f(_, 5) + 1 // Partial function application
f(_ + 1, 5) // Closure
在第一种情况下,_
正在替换整个参数。在这种情况下,它代表f
的部分应用。在实践中,它等同于x => f(x, 5) + 1
,因为包含 f
的整个表达式将变为闭包。
在第二种情况下,_
是表达式的一部分。在这种情况下,整个表达式变成一个闭包,直到任何表达式分隔符 - 我的意思是,如果表达式嵌套在另一个表达式中,则只有内部表达式变为闭包。在实践中,它相当于f(x => x + 1, 5)
。
答案 1 :(得分:4)
解析器不知道在哪里放置匿名函数的开头。有时您可以通过添加另一对括号来解决此问题(但并非总是如此):
val m: Map[String, (List[String])=>Loader] =
Map("x" -> (Loader("x", "x1", _:List[String])))
我在这里看不出任何含糊之处,所以它可能不够聪明,无法弄明白。我认为,解析器忽略了在->
之后有一个匿名函数的可能性(它也是一个库构造并使用隐式魔法和所有wicket的东西使得小解析器的思想循环)。
当你把它写成一个明确的元组时,它会正常工作。
val m: Map[String, (List[String])=>Loader] =
Map(("x", Loader("x", "x1", _:List[String])))