0

Twitter Scala School から Scala に取り組もうとしていますが、構文エラーにつまずいています。「基本の続き」チュートリアルhttp://twitter.github.io/scala_school/basics2.html#matchのパターン マッチング コードをsbt コンソールから実行すると、コンパイラは「エラー: 見つかりません: 値 &&」というメッセージを返します。 . チュートリアルが作成されたときはおそらく機能していたが、現在は機能していないものを取得するために、Scala で何かが変更されましたか? 関係するクラスは、

class Calculator(pBrand: String, pModel: String) {
  /**
   * A constructor
   */
  val brand: String = pBrand
  val model: String = pModel
  val color: String = if (brand.toUpperCase == "TI") {
    "blue"
  } else if (brand.toUpperCase == "HP") {
    "black"
  } else {
    "white"
  }

  // An instance method
  def add(m: Int, n: Int): Int = m + n
}

class ScientificCalculator(pBrand: String, pModel: String) extends Calculator(pBrand: String, pModel: String) {
  def log(m: Double, base: Double) = math.log(m) / math.log(base)
}

class EvenMoreScientificCalculator(pBrand: String, pModel: String) extends ScientificCalculator(pBrand: String, pModel: String) {
  def log(m: Int): Double = log(m, math.exp(1))
}

私のreplは次のようになります...

bobk-mbp:Scala_School bobk$ sbt console
[info] Set current project to default-b805b6 (in build file:/Users/bobk/work/_workspace/Scala_School/)
[info] Starting scala interpreter...
[info] 
Welcome to Scala version 2.9.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_17).
Type in expressions to have them evaluated.
Type :help for more information.
...
scala> def calcType(calc: Calculator) = calc match {
     |   case calc.brand == "hp" && calc.model == "20B" => "financial"
     |   case calc.brand == "hp" && calc.model == "48G" => "scientific"
     |   case calc.brand == "hp" && calc.model == "30B" => "business"
     |   case _ => "unknown"
     | }
<console>:9: error: not found: value &&
         case calc.brand == "hp" && calc.model == "20B" => "financial"
                                 ^
<console>:10: error: not found: value &&
         case calc.brand == "hp" && calc.model == "48G" => "scientific"
                                 ^
<console>:11: error: not found: value &&
         case calc.brand == "hp" && calc.model == "30B" => "business"
                                 ^
scala> 

クラス メンバーでマッチングを行っているときに、自分のケースで AND のユース ケースを取得するにはどうすればよいですか?

前もって感謝します。私はこれが初めてです。

4

2 に答える 2

3

あなたの場合のように、値でマッチングしている場合は、ガードを使用するだけでなく、単純なパターン マッチングに固執することもできます。

def calcType(calc: Calculator) = (calc.brand, calc.model)  match {
     case ("hp", "20B") => "financial"
     case ("hp", "48G") => "scientific"
     case ("hp", "30B") => "business"
     case _             => "unknown"
}

これは解析しやすいと思います。

于 2013-06-11T09:57:37.977 に答える
2

パターンで条件をテストしたい場合は、ガードを使用する必要があります:

calc match {
  case _ if calc.brand == "hp" && calc.model == "20B" => "financial"
  ...
}

you は、具体的な値は気にしないが、ガードに記載されている他の条件を_気にしないことを示します。calc

ところで、連結エクストラクタを書くことは可能です:

object && {
  def unapply[A](a: A) = Some((a, a))
}

しかし、あなたの具体的なケースではうまくいきません。

于 2013-06-11T00:01:48.187 に答える