1

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 が見つからないと言っています。

PSコードを壊すだけなのに、.toIntをaugmentString()で変更するように勧め続けるのはなぜですか?

これは、暗黙の順序付けとメソッド 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 がメソッド/演算子を typescala.collection.immutable.StringOpsに適用する方法を認識していないためaugmentString()です。

于 2013-01-20T21:52:36.760 に答える
2

augmentString呼び出すことで、文字列を明示的にStringOpsに変換していることに注意してください。StringOps は>=メソッドを定義しますが、文字列を比較するためのものです (その署名は ですdef >=(that: String): Boolean)

Int を比較したい場合は、toIntで定義されている方法を使用する必要がありますStringOps

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

また、toInt定義した (または使用しているライブラリの別の場所で定義されている) 別の暗黙的なものに対してあいまいさを解消する必要がない限り、augmentString を明示的に呼び出す必要はありません。以下は (コンパイラーがそうしないと指示しない限り) うまくいくはずであり、上記の yourStringStringOps.

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

EDIT:@som-snyttのコメントによると、あなたが得ているエラー(No implicit Ordering defined for AnyVal)は、多かれ少なかれ次のように推論するコンパイラによるものです:

  • javaVersion >= 6つまり、整数を取る javaVersion でjavaVersion.>=(6)呼び出されるメソッドを探す必要があります。>=
  • javaVersionStringOps... >=StringOps にはメソッドがあります (それが拡張しているトレイトの礼儀であり、それStringLikeが extends ですOrdered[String]) が、Int ではなく String 引数を取ります
  • Orderingに適したを提供する暗黙のスコープがあるかどうかを見てみましょうStringOpsStringここで、 aと aを比較しようとしているので、と の両方を含むことができる最も近い共通の祖先と 2 つの値を比較できる an を見Intています。この部分...]。OrderingStringIntAnyVal
  • AnyVal運が悪い...比較する暗黙の順序付けが見つからないというエラーであきらめます
于 2013-01-20T21:59:42.840 に答える