0

私はちょうど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 が使用されていますが、ここには記載されていません。

4

2 に答える 2

4

オブジェクトとクラスのメンバーは異なるスコープにあり、コンパニオンに自動的にインポートされません。そうです、資格のあるアクセスを使用するか、必要なメンバーをインポートする必要があります。

これをプライベートアクセスと混同している可能性があります。コンパニオンのプライベートメンバーにアクセスできます(ただし、資格のあるアクセスまたはインポート後のみ)。

于 2012-09-01T22:35:55.483 に答える
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行は、好みに応じて、クラス定義の内側または外側のいずれかに配置できます。

于 2012-09-01T21:50:03.783 に答える