Scala Singleton没有按预期工作

时间:2013-01-20 21:03:37

标签: scala singleton

Main.scala:

package controler

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

Utilites.scala:

package controler

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

为什么这不起作用? 我已经做了很多不同的教程网站,这没什么问题。

我总是说无法找到val Utilites。

P.S。为什么它只是在破坏代码时使用augmentString()来改变.toInt?

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

2 个答案:

答案 0 :(得分: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.StringOps返回的augmentString()类型。

答案 1 :(得分: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转换为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上查找一个名为>=的方法,该方法采用整数
  • javaVersion是一个StringOps ... StringOps中有一个>=方法(由它所扩展的StringLike特征提供,反过来扩展Ordered[String]但它需要一个String参数,而不是一个Int
  • 让我们看看我是否有隐含的范围,为Ordering提供合适的StringOps。现在,既然您正在尝试将StringInt进行比较,那么您正在查看Ordering,它可以将两个值与可以包含{{1}的最近共同祖先进行比较}和String,即Int [编辑:虽然String是一个AnyRef所以我真的没有得到这个部分......]。
  • 那里没有运气......放弃一个错误,说明没有找到比较AnyVal s
  • 的隐式排序