没有参数允许隐式类方法出错

时间:2018-01-26 20:36:52

标签: scala

我试图 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

2 个答案:

答案 0 :(得分:4)

似乎编译器感到困惑,并在最后一行中将a视为magn方法的参数。您实施norm方法没有任何问题。

可能的修复

  • 添加点 - > a.magn
  • 以分号a magn;
  • 终止行
  • 介绍空的paranthesis a magn()

答案 1 :(得分:3)

当方法不带参数时,可以使用后缀表示法(无点)可以,但是你必须帮助编译器搞清楚。

1,2,5,7,8,9,21

空行或分号告诉编译器停止查找要传递给方法的参数。它不会来。

通常最好只为最简单,最明显的声明(全部3个)保留无点符号。