1

在使用 Scala 的组合器解析框架时,我在解析浮点数时遇到了以下问题:

import scala.util.parsing.combinator.JavaTokenParsers
import org.junit.runner.RunWith
import org.scalatest.FlatSpec
import org.scalatest.junit.ShouldMatchersForJUnit
import org.scalatest.junit.JUnitRunner

@RunWith(classOf[JUnitRunner])
class SandboxSpec extends FlatSpec with ShouldMatchersForJUnit {
  "A java token parser" should "parse a float" in {

    class Parser extends JavaTokenParsers {
      def realValue: Parser[Float] = floatingPointNumber ^^ {
        s => s.toFloat
      }
    }

    val p = new Parser()
    val result = p.parseAll(p.realValue, "5.4") match {
      case p.Success(x, _)     => x
      case p.Failure(msg, _) => fail(msg)
    }

    result should equal (5.4f plusOrMinus 0.0001f)

  }
}

此测试产生以下错误:

5.4 did not equal FloatTolerance(5.4,1.0E-4)

我不确定它是否是解析器代码产生的不是类似浮点的东西(不过,用调试器查看它,它显然是一个 Java 浮点),或者它是否是 ScalaTest 匹配器的问题。

有什么想法吗?

4

1 回答 1

2

在 ScalaTest中equal总是意味着==,因此对象相等。因此,您的代码不会成功,因为5.4不等于FloatTolerance.

要更正您的测试用例使用be,它被重载以获取以下实例FloatTolerance

result should be (5.4f plusOrMinus 0.0001f)

顺便说一句,您的代码会引发警告:

匹配可能并不详尽。它会在以下输入上失败:Error(_, _)

为了消除它,选择case p.NoSuccess(msg, _) =>而不是case p.Failure(msg, _) =>

于 2012-12-09T01:50:17.257 回答