我在理解Array.scala中的以下方法签名时遇到了一些麻烦:
def fill[T: ClassTag](n1: Int, n2: Int)(elem: => T): Array[Array[T]]
我已经从这里阅读了多态方法的概念:http://www.scala-lang.org/old/node/121.html
fill
的方法似乎确实按带有值参数的类型T
进行参数化。不过,这里的方法签名让我感到困惑。它似乎是一个接受多个参数的"柯里函数",但随后有两个参数n1
,n2
在一个括号中,一个函数作为第二个参数传入。这就像一个高阶函数被传递到fill
。但这看起来也不太对劲。
如果有人能用线索为我指出正确的方向,我可以更多地了解fill
方法的工作原理,例如方法主体。
您在此处引用的方法创建并填充二维数组。 前 2 个参数,Int
s,指示数组的尺寸(X 和 Y 轴)。
第三个参数位于单独的参数组中。这是咖喱的部分。 如果它是fill(n1, n2, elem)
写的,那么它就不是一个柯里的方法。 或者所有参数都可以被柯里化:fill(n1)(n2)(elem)
. 在Haskell中,所有参数都是柯里化的。
elem: => T
表示法表示这是一个"按名称"参数。 它看起来类似于函数定义,但事实并非如此。 它只是意味着接收到的参数 elem
在调用时不被计算。 它在引用时被评估,这可能永远不会。 例如:
Array.fill(x,y)(/*some-long-calculation*/)
在这种情况下,如果x
或y
为零,则不执行"多头计算"。