Scala詳細-------特徴、パターンマッチング

113909 ワード

プロパティは、メソッドとフィールド定義をカプセル化し、クラスにブレンドすることで再利用できます.クラス継承とは異なり、各クラスは1つの親のみを継承する必要があります.1つのクラスは任意の数で特質的に混合できます.
フィーチャーは、サポートされるメソッドの署名によって定義されるオブジェクトタイプを指定するために使用されます.Scalaでは特性の一部を実装することも可能であるが,構造パラメータを持たない可能性がある.
1つのフィーチャー定義は、キーワードtraitを使用して次のクラス定義のように見えます.
trait Equal {
  def isEqual(x: Any): Boolean
  def isNotEqual(x: Any): Boolean = !isEqual(x)
}

この特質は2つの方法によるisEqualとisNotEqualである.ここでは、別の方法として実装されているisEqualは、実装されていません.拡張特性のサブクラスは、実装されていない方法を実装することができる.したがって,Javaに非常に似た抽象クラスが特徴である.次に、特性の概念を説明する完全な例を示します.
trait Equal {
  def isEqual(x: Any): Boolean
  def isNotEqual(x: Any): Boolean = !isEqual(x)
}

class Point(xc: Int, yc: Int) extends Equal {
  var x: Int = xc
  var y: Int = yc
  def isEqual(obj: Any) =
    obj.isInstanceOf[Point] &&
    obj.asInstanceOf[Point].x == x
}

object Test {
   def main(args: Array[String]) {
      val p1 = new Point(2, 3)
      val p2 = new Point(2, 4)
      val p3 = new Point(3, 3)

      println(p1.isNotEqual(p2))
      println(p1.isNotEqual(p3))
      println(p1.isNotEqual(2))
   }
}

上記のコードがコンパイルおよび実行されると、次の結果が得られます.
C:/>scalac Test.scala
C:/>scala Test
false
true
true

C:/>

プロパティはいつ使用しますか?
厳格な規定はありませんが、ここにはいくつかの指導原則があります.
動作が再利用されない場合は、特定のクラスにします.繰り返し使用できる動作ではありません.
複数の関連しないクラスで再利用される可能性がある場合は、性状になります.特性が混入できるクラス階層の異なる部分のみ.
Javaコードを継承する場合は、抽象クラスを使用します.
コンパイルされた形式で配布し、外部組織が作成したクラスを継承する場合は、抽象クラスを使用する傾向があります.
効率が非常に重要であれば、クラスを使用する傾向があります.
パターンマッチングはScalaで2番目に広く使われている機能であり,関数値と閉包を経ている.Scalaではモードマッチング処理メッセージを強力にサポートしている.パターンマッチングには、キーワードcaseを使用するたびに代替シーケンスが含まれます.各バリエーションには、パターンが一致する場合に計算される1つまたは複数の式が含まれます.矢印記号=>別々の表現モード.ここでは、上記のコードがコンパイルおよび実行されると、case文ブロックを使用して整数文字列をマッピングする関数を定義する
object Test {
   def main(args: Array[String]) {
      println(matchTest(3))

   }
   def matchTest(x: Int): String = x match {
      case 1 => "one"
      case 2 => "two"
      case _ => "many"
   }
}
の整数値を一致させる方法を示す小さな例です.マッチングキーワードは、モードマッチング関数以上のような関数を1つのオブジェクトに適用する便利な方法を提供します.次に、異なるタイプのモード値に一致する第2の例を示す:
C:/>scalac Test.scala
C:/>scala Test
many

C:/>
上記のコードがコンパイルおよび実行されると、xが整数値を指す場合、
object Test {
   def main(args: Array[String]) {
      println(matchTest("two"))
      println(matchTest("test"))
      println(matchTest(1))

   }
   def matchTest(x: Any): Any = x match {
      case 1 => "one"
      case "two" => 2
      case y: Int => "scala.Int"
      case _ => "many"
   }
}
の第1のcaseが生成する.xが文字列「2」の第2 caseと一致する場合.第3のcaseは入力モードである.任意の整数に対して一致し、選択値xto整数タイプの変数yと結合する.次はテキストの一致です...case式はかっこ{...}別の形式:
C:/>scalac Test.scala
C:/>scala Test
2
many
one

C:/>
マッチングcaseクラスを使用します.case classesは、モードマッチングとcase式指定クラスです.これらはすべて標準クラスで特殊な修飾を持っています:case.次に、case classマッチングを使用する簡単なモードの例を示します.
object Test {
   def main(args: Array[String]) {
      println(matchTest("two"))
      println(matchTest("test"))
      println(matchTest(1))

   }
   def matchTest(x: Any){
      x match {
         case 1 => "one"
         case "two" => 2
         case y: Int => "scala.Int"
         case _ => "many"
      }
   }
}
上記のコードがコンパイルおよび実行されると、
object Test {
   def main(args: Array[String]) {
   	val alice = new Person("Alice", 25)
	   val bob = new Person("Bob", 32)
   	val charlie = new Person("Charlie", 32)
   
      for (person <- List(alice, bob, charlie)) {
         person match {
            case Person("Alice", 25) => println("Hi Alice!")
            case Person("Bob", 32) => println("Hi Bob!")
            case Person(name, age) =>
               println("Age: " + age + " year, name: " + name + "?")
         }
      }
   }
   // case class, empty one.
   case class Person(name: String, age: Int)
}
はcaseキーワードを追加してコンパイラに多くの実用的な機能を自動的に追加するという結果を生じる.キーワードがパターンに一致する場合の式の関連付けを推奨します.まず、コンパイラが自動的に変換するコンストラクション関数のパラメータは、可変フィールド(vals)です.valキーワードはオプションです.可変フィールドを使用する場合はvarキーを使用します.したがって,構造関数のパラメータ列はより短く表現される.次に、コンパイラは、構造関数パラメータとして指定されたフィールドを使用するequals、hashCode、およびtoStringメソッドのクラスを自動的に実装します.したがって、独自のTOStringメソッドは不要です.最後に、Personクラスの本体部分も消えてしまいます.定義する方法がないからです.