1

Main.scala:

package controler

object Main {
    def main(args: Array[String]) {
      import Utilites._
      isJavaUpToDate
    }
}

实用程序.scala:

package controler

object Utilities {
  def isJavaUpToDate = { 
    val javaVersion = augmentString(System.getProperty("java.version").substring(2, 3))
    javaVersion >= 6 
  }
}

为什么这不起作用?我已经找到了一堆不同的教程网站,这些网站没有问题。

我总是说找不到 val Utilites。

PS为什么它只是破坏代码时不断建议我用augmentString()更改.toInt?

现在这给我带来了麻烦,关于隐式排序和方法 orderTOOrdered。

4

2 回答 2

5

在您的main方法中,您输入Utilites了您要输入的位置Utilities

Correct: Utilities
Wrong:   Utilites

注意遗漏i:) 因为你的大脑是一个强大的拼写纠正工具,它假装拼写是正确的。不过,Scala 编译器并不那么酷;)


另外,对我来说,以下不起作用:

scala> augmentString(System.getProperty("java.version").substring(2, 3)) >= 5
<console>:15: error: No implicit Ordering defined for AnyVal.
          augmentString(System.getProperty("java.version").substring(2, 3)) >= 5

相反,我将其替换为

System.getProperty("java.version").substring(2, 3)).toInt >= 5

您在以前的代码中遇到的隐式排序问题是因为 Scala 不知道如何将>=方法/运算符应用于返回的scala.collection.immutable.StringOpstype augmentString()

于 2013-01-20T21:52:36.760 回答
2

请注意,通过调用augmentString您将字符串显式转换为StringOps。StringOps 确实定义了一个>=方法,但它是用来比较字符串的(它的签名是def >=(that: String): Boolean

如果你想比较 Ints,你应该toInt使用StringOps.

def isJavaUpToDate = { 
    val javaVersion = augmentString(System.getProperty("java.version").substring(2, 3)).toInt
    javaVersion >= 6 
  }

此外,除非您需要toInt针对您定义的另一个隐式(或在您正在使用的库中的其他位置定义)消除歧义,否则不需要显式调用 augmentString。以下内容应该可以正常工作(除非编译器告诉您它不可以),并且它应该隐含地与上面将您转换String为 a的代码具有相同的效果StringOps

def isJavaUpToDate = { 
    val javaVersion = System.getProperty("java.version").substring(2, 3)
    javaVersion.toInt >= 6 
  }

编辑:根据@som-snytt 的评论你得到的错误(No implicit Ordering defined for AnyVal)是由于编译器的推理或多或少是这样的:

  • javaVersion >= 6意味着javaVersion.>=(6),即我必须寻找一个>=在 javaVersion 上调用的方法,它需要一个整数
  • javaVersionStringOps...在 StringOps 中有一个>=方法(由StringLike它扩展的特征提供,这反过来又 extends Ordered[String])但它需要一个 String 参数,而不是 Int
  • 让我们看看我是否有一个隐含的范围,它提供了一个适合OrderingStringOps. 现在,由于您正在尝试将 aString与 a进行比较,因此Int您正在查看Ordering可以将两个值与可以包含两者的最近的共同祖先进行比较String的an Int,即AnyVal[编辑:虽然 String 是 AnyRef 所以我真的不明白这部分...]。
  • 没有运气......放弃一个错误,说没有找到隐式排序比较AnyVals
于 2013-01-20T21:59:42.840 回答