1

scaladocVector#fill看起来像:

def fill[A](n: Int)(elem: ⇒ A): Vector[A]
n the number of elements contained in the collection.
elem the element computation
returns A collection that contains the results of n evaluations of elem.

但这就是我调用它的方式:

Vector.fill[Boolean](5)(true)

在哪里elem?这是什么意思?

4

2 回答 2

10

fill方法 ( => A)中的 elems 签名表示by-name参数。它与简单的by-value参数(如n: Int在您的示例中)的不同之处在于,在调用方法时不计算,而是在方法主体中引用它们时计算。

所以方法填充意味着它获取结果向量中的元素数量并用类型 A 的元素填充它,by-name因为您可以填充向量,例如。带对象,如果您使用by-value参数,则生成的向量将包含相等的对象,但带by-value参数它将在每个循环中粘贴新对象。

执行:

def fill[A](n: Int)(elem: => A): CC[A] = {
  val b = newBuilder[A]
  b.sizeHint(n)
  var i = 0
  while (i < n) {
    b += elem // compute elem and add to the collection
    i += 1
  }
  b.result
}
于 2013-05-29T06:45:53.523 回答
2

elem 是一个函数,当被调用一次时,将产生一个类型为“A”的实例,在这种情况下为布尔值。因此,在您的情况下,函数“true”被调用 5 次,每次都返回“true”。

“elem”属于“调用时返回 A 的方法”类型

提供参数中的 ()() 表示法也允许您先只提供部分参数,然后传递部分“填充”函数。称为柯里化。

于 2013-05-29T06:05:02.857 回答