1

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

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

在线的

this.tX = cX

代码:

class Quaternion {  
  private var tX: Float = 0
  private var tY: Float = 0
  private var tZ: Float = 0
  private var tW: Float = 1

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

  ...

请帮我解决我可能明显的错误。

4

3 回答 3

10

参考总是回答它(§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
    }
于 2013-09-03T13:31:29.863 回答
6

我认为你应该考虑把它变成一个案例类,并且是不可变的。这看起来像这样(注意,通常我更喜欢双精度浮点数):

case class Quaternion(tX: Double = 0.0, tY: Double = 0.0, tZ: Double = 0.0, tW: Double = 1.0)

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

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)
于 2013-09-03T13:53:53.700 回答
5

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

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)

或者

case class Quaternion(cX: Float, cY: Float, cZ: Float, cW: Float) {
   def this() = this(0,0,0,1)
}

scala> new Quaternion()
res2: Quaternion = Quaternion(0.0,0.0,0.0,1.0)

或者

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

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

如果你需要改变 var,你总是可以使用 copy 方法。

于 2013-09-03T13:53:37.997 回答