奇怪..。
val h = new HashMap[Long, Int]()
def mydefault0():Int = 101
println( h.getOrElse(99, default=mydefault0 _ ) ) // Prints <function0>
def mydefault1(key:Long):Int = 102
println( h.getOrElse(98, default=mydefault1 _ ) ) // Prints <function1>文档说默认值必须是类型:=> B
如果我正确理解,则返回Int的no-arg函数,在本例中。
编辑
显然:
还可以使用函数指定默认值。我想要的是能够用在执行查找时提供的函数覆盖默认值(也就是说,函数在Map的生命周期中可能会发生变化)。
这个是可能的吗?
发布于 2013-12-23 21:21:08
getOrElse[B1 >: B](key: A, default: => B1): B1default参数不接受一个函数--它将是() => B1,而是一个延迟访问的B1类型的值。这种无参数的“函数”=> B1有时也称为thunk。正确的使用方法如下:
import collection.mutable
val h = new mutable.HashMap[Long, Int]()
def mydefault0(): Int = 101
println(h.getOrElse(99, default = mydefault0()))那么你在mydefault0 _上看到的是什么呢?显然,返回的值有B1类型,它必须是映射值类型Int和默认值类型的公共超类型。默认值的类型是Function0。如果分配结果,则会看到超类为Any。
val x = h.getOrElse(99, default = mydefault0 _ ) // x: Any = <function0>因此,错误是假设您必须传递一个函数,而实际上您是在声明一个被延迟计算的表达式。只有在需要默认值时才会调用调用mydefault0()。在形式上,参数被定义为点名参数。
编辑:关于你的评论。按名调用意味着每次都会得到一个新的数组。
val m = Map("foo" -> Array(1, 2, 3))
def myDefault = {
println("called-default")
Array(4, 5, 6)
}
val a1 = m.getOrElse("foo", myDefault) // myDefault not called
val a2 = m.getOrElse("bar", myDefault) // myDefault called
val a3 = m.getOrElse("baz", myDefault) // myDefault called
a2 == a3 // false!!https://stackoverflow.com/questions/20751197
复制相似问题