使用伴随对象时的方法名称限定

时间:2012-09-01 21:48:09

标签: scala methods companion-object

我只是在学习Scala。我创建了一个伴随对象(参见下面的代码片段),我在其中定义了一个运算符^,(表示复杂的共轭)。我必须使用关联类中的伴随对象名称来限定它。我的印象是我应该无条件地访问同伴的方法。有人可以告诉我,如果我做错了吗?

class CQ(val r: Q, val i:Q) {

  def +(z : CQ): CQ = {
    return new CQ(r + z.r, i + z.i)
  }

  def -(z: CQ): CQ = {
    return new CQ(r - z.r, i-z.i)
  }

  def *(z: CQ): CQ = {
    return new CQ(r*z.r - i*z.i, r*z.i + i*z.r)
  }

  def /(z: CQ): CQ = {
    val d = z.r * z.r + z.i * z.i
    val n = this * CQ.^(z) // that I needed to qualify "^" is what I don't get
    return new CQ(n.r / d, n.i /d)
  }

  override def toString = r + " + " + i + "i"
}
object CQ {

  def ^(z : CQ) : CQ = {
    return new CQ(z.r, Q.NEGONE*z.i)
  }

  val ONE = new CQ(Q.ONE,Q.ZERO)
  val ZERO = new CQ(Q.ZERO, Q.ZERO)
  val I = new CQ(Q.ZERO, Q.ONE)
  val NEGONE = I * I
}

注意:此处使用的是另一个类Q,但未列出。

2 个答案:

答案 0 :(得分:4)

对象和类的成员位于不同的范围内,不会自动导入到协同服务器中。所以,是的,您需要使用合格的访问权限或导入您需要的成员。

您可能会将此与私人访问混淆:您可以访问该随播广告的私人成员(但只能通过限定访问权限或导入后)。

答案 1 :(得分:2)

您需要导入该函数以使其在范围内:

import CQ.^

或者,从同伴对象导入所有内容:

import CQ._

一个例子:

class A(x: Int) {
  import A.^
  def f(y: Int) = x * ^(y)
}
object A {
  def ^(a: Int) = a - 1
}

println(new A(4).f(3))

import行可以在类定义的内部或外部,具体取决于您的偏好。