Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.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_Methods_Companion Object - Fatal编程技术网

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

Scala 使用伴随对象时的方法名称限定,scala,methods,companion-object,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

我只是在学习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,但未列出。

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

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 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))

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

对象和类的成员位于不同的作用域中,并且不会自动导入到伴奏中。因此,是的,您要么需要使用合格的访问权限,要么需要导入所需的成员


您可能会将其与私有访问混淆:您可以访问同伴的私有成员(但只能通过限定访问或导入后进行访问)。

对象和类的成员位于不同的作用域中,并且不会自动导入同伴。因此,是的,您要么需要使用合格的访问权限,要么需要导入所需的成员


您可能会将其与私有访问混淆:您可以访问同伴的私有成员(但只能通过限定访问或导入后进行访问)。

注意
return
关键字的样式不好
def+(z:CQ)=新的CQ(r+z.r,i+z.i)
是您所需要的全部注意
return
关键字样式不好
def+(z:CQ)=新的CQ(r+z.r,i+z.i)
就是您所需要的