Scala自我类型:值不是成员错误 [英] scala self-type: value is not a member error
问题描述
这是此问题的后续操作./p>
我正在尝试使用自类型的通用超类在scala中实现向量:
trait Vec[V] { self:V =>
def /(d:Double):Vec[V]
def dot(v:V):Double
def norm:Double = math.sqrt(this dot this)
def normalize = self / norm
}
这是3D矢量的实现:
class Vec3(val x:Double, val y:Double, val z:Double) extends Vec[Vec3]
{
def /(d:Double) = new Vec3(x / d, y / d, z / d)
def dot(v:Vec3) = x * v.x + y * v.y + z * v.z
def cross(v:Vec3):Vec3 =
{
val (a, b, c) = (v.x, v.y, v.z)
new Vec3(c * y - b * z, a * z - c * x, b * x - a * y)
}
def perpTo(v:Vec3) = (this.normalize).cross(v.normalize)
}
不幸的是,这无法编译:
Vec3.scala:10: error: value cross is not a member of Vec[Vec3]
def perpTo(v:Vec3) = (this.normalize).cross(v.normalize)
^
出了什么问题,我该如何解决?
此外,任何对自类型的引用将不胜感激,因为我认为这些错误是由于缺乏理解而产生的.
要摆脱所有麻烦,您必须指定类型参数V
是Vec
的子类.
现在您可以在任何地方使用V
了,因为您的特征知道V
继承了所有Vec[V]
方法.
trait Vec[V <: Vec[V]] { self: V =>
def -(v:V): V
def /(d:Double): V
def dot(v:V): Double
def norm:Double = math.sqrt(this dot this)
def normalize: V = self / norm
def dist(v: V) = (self - v).norm
def nasty(v: V) = (self / norm).norm
}
请注意方法nasty
不会与this question.
I'm trying to implement vectors in scala with a generic super class using self-types:
trait Vec[V] { self:V =>
def /(d:Double):Vec[V]
def dot(v:V):Double
def norm:Double = math.sqrt(this dot this)
def normalize = self / norm
}
Here's an implementation of a 3D vector:
class Vec3(val x:Double, val y:Double, val z:Double) extends Vec[Vec3]
{
def /(d:Double) = new Vec3(x / d, y / d, z / d)
def dot(v:Vec3) = x * v.x + y * v.y + z * v.z
def cross(v:Vec3):Vec3 =
{
val (a, b, c) = (v.x, v.y, v.z)
new Vec3(c * y - b * z, a * z - c * x, b * x - a * y)
}
def perpTo(v:Vec3) = (this.normalize).cross(v.normalize)
}
Unfortunately this doesn't compile:
Vec3.scala:10: error: value cross is not a member of Vec[Vec3]
def perpTo(v:Vec3) = (this.normalize).cross(v.normalize)
^
What's going wrong, and how do I fix it?
Additionally, any references on self-types would be appreciated because I think these errors are cropping up from my lack of understanding.
To get rid of all the nastiness, you have to specify that the type parameter V
is a subclass of Vec
.
Now you can just use V
everywhere, because your trait knows that V
inherits all Vec[V]
methods.
trait Vec[V <: Vec[V]] { self: V =>
def -(v:V): V
def /(d:Double): V
def dot(v:V): Double
def norm:Double = math.sqrt(this dot this)
def normalize: V = self / norm
def dist(v: V) = (self - v).norm
def nasty(v: V) = (self / norm).norm
}
Note the method nasty
which won’t compile with Easy Angel’s approach.
这篇关于Scala自我类型:值不是成员错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!