Scala多构造函数问题

Scala多构造函数问题,scala,syntax,constructor,Scala,Syntax,Constructor,我不明白为什么这个代码是错误的,错误信息是: error: '}' expected but '.' found. 在线 this.tX = cX 代码: 请帮助我纠正可能明显的错误。像往常一样回答它(§5.3.1和示例5.3.3): 为了防止构造函数调用的有限周期,有 每个自构造函数调用必须引用 之前的建造商定义(即必须参考 前一个辅助构造函数或 类) 在您的情况下,将其更改为: def this(cX: Float, cY: Float, cZ: Float, cW: Float) {

我不明白为什么这个代码是错误的,错误信息是:

error: '}' expected but '.' found.
在线

this.tX = cX
代码:

请帮助我纠正可能明显的错误。

像往常一样回答它(§5.3.1和示例5.3.3):

为了防止构造函数调用的有限周期,有 每个自构造函数调用必须引用 之前的建造商定义(即必须参考 前一个辅助构造函数或 类)

在您的情况下,将其更改为:

def this(cX: Float, cY: Float, cZ: Float, cW: Float) {
      this()
      this.tX = cX
      this.tY = cY
      this.tZ = cZ
      this.tW = cW
    }
像往常一样回答它(§5.3.1和示例5.3.3):

为了防止构造函数调用的有限周期,有 每个自构造函数调用必须引用 之前的建造商定义(即必须参考 前一个辅助构造函数或 类)

在您的情况下,将其更改为:

def this(cX: Float, cY: Float, cZ: Float, cW: Float) {
      this()
      this.tX = cX
      this.tY = cY
      this.tZ = cZ
      this.tW = cW
    }

我强烈建议使用带有伴生对象、构造函数重载或默认值的不可变case类:

case class Quaternion(cX: Float, cY: Float, cZ: Float, cW: Float)

object Quaternion {
   def apply() = new Quaternion(0,0,0,1)
}

scala> Quaternion()
res0: Quaternion = Quaternion(0.0,0.0,0.0,1.0)


如果您需要更改var,您可以始终使用copy方法。

我强烈建议将不可变case类与伴随对象、构造函数重载或默认值一起使用:

case class Quaternion(cX: Float, cY: Float, cZ: Float, cW: Float)

object Quaternion {
   def apply() = new Quaternion(0,0,0,1)
}

scala> Quaternion()
res0: Quaternion = Quaternion(0.0,0.0,0.0,1.0)


如果您需要更改var,您可以始终使用copy方法。

我认为您应该考虑将其作为一个case类,并且是不可变的。这看起来像这样(注意,通常我更喜欢双打而不是浮动):

然后可以按照以下示例创建实例:

scala> val qDefault = Quaternion()
qDefault: Quaternion = Quaternion(0.0,0.0,0.0,1.0)

scala> val q1234 = Quaternion(1,2,3,4)
q1234: Quaternion = Quaternion(1.0,2.0,3.0,4.0)

scala> val q0101 = Quaternion(tY = 1.0)
q0101: Quaternion = Quaternion(0.0,1.0,0.0,1.0)

我认为您应该考虑将其作为一个case类,并且是不可变的。这看起来像这样(注意,通常我更喜欢双打而不是浮动):

然后可以按照以下示例创建实例:

scala> val qDefault = Quaternion()
qDefault: Quaternion = Quaternion(0.0,0.0,0.0,1.0)

scala> val q1234 = Quaternion(1,2,3,4)
q1234: Quaternion = Quaternion(1.0,2.0,3.0,4.0)

scala> val q0101 = Quaternion(tY = 1.0)
q0101: Quaternion = Quaternion(0.0,1.0,0.0,1.0)

Scala中的构造函数重载与Java中的构造函数重载有很大不同。这方面有很多资源。只要在谷歌上搜索一下,你就会得到足够的信息。Scala中的构造函数重载工作原理与Java中的大不相同。这方面有很多资源。只要在谷歌上搜索一下,你就会得到足够的信息。谢谢,这正是我所需要的谢谢,这正是我所需要的投票,因为我认为同伴对象技术比选择答案更普遍。不知何故,为了创建一个用于Json编写的case类,我一直在寻找这一点。它很有用,但我无法使用Json.writes,因为与apply和Json相关的已知限制:。这可以通过不重载apply:Voted来解决,因为我认为伴随对象技术比选择的答案更通用。不知何故,为了创建一个用于Json编写的case类,我一直在寻找这一点。它很有用,但我无法使用Json.writes,因为与apply和Json相关的已知限制:。这可以通过不重载apply来解决:
scala> val qDefault = Quaternion()
qDefault: Quaternion = Quaternion(0.0,0.0,0.0,1.0)

scala> val q1234 = Quaternion(1,2,3,4)
q1234: Quaternion = Quaternion(1.0,2.0,3.0,4.0)

scala> val q0101 = Quaternion(tY = 1.0)
q0101: Quaternion = Quaternion(0.0,1.0,0.0,1.0)