Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解以函数为参数的辅助构造函数中的Scala行为_Scala_Multiple Constructors - Fatal编程技术网

理解以函数为参数的辅助构造函数中的Scala行为

理解以函数为参数的辅助构造函数中的Scala行为,scala,multiple-constructors,Scala,Multiple Constructors,我一直在学习Scala,到目前为止它一直都很好,可悲的是我发现了一些我不完全理解的行为。我希望你们能给我一些线索,当我编写这个类时,问题出现了: class Point(iDim:Int,data:Array[Double],f: Array[Double] => Double) { ... def this(idim: Int, obj :ObjectThatGenerate_ArrayofDouble, f: Array[Double] => Double){ this(id

我一直在学习Scala,到目前为止它一直都很好,可悲的是我发现了一些我不完全理解的行为。我希望你们能给我一些线索,当我编写这个类时,问题出现了:

class Point(iDim:Int,data:Array[Double],f: Array[Double] => Double) {
...
def this(idim: Int, obj :ObjectThatGenerate_ArrayofDouble, f: Array[Double] => Double){
  this(idim,obj.generateArray(idim),f)
}
}
因此,当我在主代码中使用这些构造函数时,我需要这样做

var p:Point = new Point (idim,obj,f _)

但是如果我删除辅助构造函数,我只需要像这样构建对象:

var p:Point = new Point (idim, dataArray, f)

为什么在scala中,当我有一个辅助构造函数时,我需要传递一个部分实现的函数“f”?当我没有辅助构造函数时,我可以直接传递函数“f”?或者字符“f”在这个上下文中有另一种含义?

正如@ghik所说,使用方法时存在类型推断限制(或者在本例中是构造函数)重载。一般来说,您应该尽量避免重载,这几乎从来都不是好的做法

这里的一项工作是使用第二个参数列表,例如

trait Generator {
  def generateArray(idim: Int): Array[Double]
}

class Point(iDim: Int, data: Array[Double], f: Array[Double] => Double) {
  def this(idim: Int, gen: Generator)(f: Array[Double] => Double) {
    this(idim, gen.generateArray(idim), f)
  }
}

val obj = new Generator {
  def generateArray(idim: Int) = new Array[Double](idim)
}

def f(arr: Array[Double]) = arr.sum

new Point(33, obj)(f)
在Scala中,将函数参数放入第二个参数列表是很常见的,因为它为函数文本提供了方便的语法。由于
newpoint(…){…}
将被解释为使用匿名体扩展类,因此更好的解决方案和摆脱重载的方法是使用伴随对象:

object Point {
  def apply(idim: Int, gen: Generator)(f: Array[Double] => Double) =
    new Point(idim, gen.generateArray(idim), f)
}
class Point(iDim: Int, data: Array[Double], f: Array[Double] => Double)

Point(33, obj)(f)
Point(33, obj) { arr => arr.sum / arr.size }

(注意:您还可以编写带有一个参数列表的
apply
方法。因为它没有重载,所以您不必声明下划线)

这看起来像是类型推断的一些不幸限制,这里在处理重载构造函数时遇到了一些问题。
object Point {
  def apply(idim: Int, gen: Generator)(f: Array[Double] => Double) =
    new Point(idim, gen.generateArray(idim), f)
}
class Point(iDim: Int, data: Array[Double], f: Array[Double] => Double)

Point(33, obj)(f)
Point(33, obj) { arr => arr.sum / arr.size }