我试图 cram 刷新Scala以获得我的工作,并且我正在研究隐式类。到目前为止,它们在使代码更具可读性方面似乎非常方便,但我遇到了一个我无法弄清楚的问题。
在这段代码中,我实现了一些常见的向量操作,并且在大多数情况下它们似乎运行得很好。但是,当我添加norm
方法时,magn
方法开始抛出错误。因此我的操作脚本是:
import scala.language.postfixOps
import scala.math.sqrt
case class Vector(x: Double, y: Double)
object VMath {
implicit class VectorMath(v1: Vector) {
def dot(v2: Vector): Double = v1.x * v2.x + v1.y * v2.y
def cross(v2: Vector): Double = v1.x * v2.y - v1.y * v2.x
def magn(): Double = sqrt(v1.x * v1.x + v1.y * v1.y)
def norm(): Vector = Vector(v1.x / magn, v1.y / magn)
}
}
import VMath._
val a = Vector(1.0, 2.0)
val b = Vector(3.0, 4.0)
a dot b
a cross b
a magn
a norm
每当我运行此代码时,行a magn
都会抛出一个读取
no arguments allowed for nullary method magn: ()Double
在我实施norm
方法之前运行没有问题,并且在 norm
方法中没有问题。我不确定这是否是由于我对Scala本身的工作方式的误解,postfixObs
如何工作,隐式类如何工作,单行方法如何工作,或者它是否只是一些愚蠢的错字我失踪了,但这让我撕裂了我的头发。 (我碰巧喜欢我的头发,所以...)
可以测试我的代码并在Scastie上重新创建问题:https://scastie.scala-lang.org/0jvrx4lYQwauBpN6IZtSPA
答案 0 :(得分:4)
似乎编译器感到困惑,并在最后一行中将a
视为magn
方法的参数。您实施norm
方法没有任何问题。
可能的修复
a.magn
a magn;
a magn()
答案 1 :(得分:3)
当方法不带参数时,可以使用后缀表示法(无点)可以,但是你必须帮助编译器搞清楚。
1,2,5,7,8,9,21
空行或分号告诉编译器停止查找要传递给方法的参数。它不会来。
通常最好只为最简单,最明显的声明(全部3个)保留无点符号。