Scala basis variables

3710 ワード

Scala Basic Literals
  • Integer , Float , Boolean
  • SymbolというSymbol変数は初めて見たので、わざわざ時間をかけて研究してみました.SymbolはScalaのいわゆるliteralタイプの一種で、literalは字面的にテキストを意味し、コードに直接定数値として書くことができるものとして表現されています.

  • Symbolは本質的に文字列の再パッケージであり、同じ値(名前)のSymbolは同じinstanceを有するが、同じ名前(値)の文字列は必ずしも同じinstanceではない.
    ある文字列が繰り返され、値が変わらない場合はSymbolを使用できますが、必ずしも必要ではありません.文字列の変数名も使用できます.
    Stringタイプと比較してSymbolタイプには、メモリの節約と高速比較の2つの特徴があります.理解するために、まずJavaにおけるStringのintern()メソッドについて理解してみましょう.
    Oracleの開発ドキュメントでは、Stringクラス内で文字列プール(strings pool)を維持し、Stringのintern()メソッドを呼び出すと、文字列プールにすでに文字列が存在する場合は、プール内の文字列参照を直接返し、存在しない場合はプールに追加し、その文字列オブジェクトの参照を返します.Intern()メソッドを実行した文字列は、この文字列が拘束されていると言います.デフォルトでは、コード内の文字列の字面量と文字列定数の値は、次のように制限されています.
    String s1 = "abc";
    String s2 = new String("abc");
    //  true
    System.out.println(s1 == s2.intern());
    
    String s2 = new String("abc");
    String s3 = new String("abc");
    //  true
    System.out.println(s2.intern() == s3.intern());
    //  false
    System.out.println(s2 == s3);
    

    ScalaではSymbolタイプのオブジェクトは拘禁されており、任意の同名symbolsは同じSymbolオブジェクトを指しており、冗長性によるメモリオーバーヘッドを回避しています.Stringタイプでは、コンパイル時に決定された文字列のみが拘束されます.Scalaテストコードは以下の通りです.
    val s = 'aSymbol
    //  true
    println( s == 'aSymbol)
    //  true
    println( s == Symbol("aSymbol"))
    

    両方の結果は同じtrueを返しますが、Symbolタイプのオブジェクトは拘束されているため、任意の同じsymbolsが同じSymbolオブジェクトを指し、同じ名前のsymbolsが異なるSymbolオブジェクトを指しているわけではありません.symbolsオブジェクト間でオペレータ==を使用して迅速に等化比較することができ、定数時間内に完了することができます.一方,文字列のequalsメソッドでは,2つの文字列を1文字ずつ比較する必要があり,実行時間は2つの文字列の長さに依存し,速度が遅い.(実際にはString.equalsメソッドでは、参照が同じかどうかを比較しますが、実行時に生成される文字列オブジェクトでは、参照は一般的に異なります)
    Symbolタイプは一般的に高速比較に使用されます.例えば、Mapタイプ:Mapでは、1つのSymbolオブジェクトに基づいて対応するDataを迅速にクエリーできますが、Mapのクエリー効率は非常に低いです.
    Variable Declaration
    scalaには2つの変数タイプがあり、varとval var myVar : String = "Foo" varは可変です.val myVal : String = "Foo" valは可変ではありません.変数タイプを指示しない場合は、デフォルトを使用します.システムは自動的にタイプを確認します.
    var myVar = 10;
    val myVal = "Hello, Scala!";
    

    scalaはtupleオブジェクトをサポートしてオブジェクトを定義します.
    val (myVar1: Int, myVar2: String) = Pair(40, "Foo")
    val (myVar1, myVar2) = Pair(40, "Foo")
    

    scala class
    クラスの定義
    import java.io._
    #   
    class Point(val xc: Int, val yc: Int) {
       var x: Int = xc
       var y: Int = yc
       def move(dx: Int, dy: Int) {
          x = x + dx
          y = y + dy
          println ("Point x location : " + x);
          println ("Point y location : " + y);
       }
    }
    #main function
    object Demo {
       def main(args: Array[String]) {
          val pt = new Point(10, 20);
          // Move to a new location
          pt.move(10, 10);
       }
    }
    

    scala consoleで実行するには、まずコンパイルし、実行する必要があります.
    \>scalac Demo.scala
    \>scala Demo
    

    クラスの継承
    import java.io._
    class Point(val xc: Int, val yc: Int) {
       var x: Int = xc
       var y: Int = yc
       def move(dx: Int, dy: Int) {
          x = x + dx
          y = y + dy
          println ("Point x location : " + x);
          println ("Point y location : " + y);
       }
    }
    #location Point   。
    class Location(override val xc: Int, override val yc: Int,
       val zc :Int) extends Point(xc, yc){
       var z: Int = zc
       def move(dx: Int, dy: Int, dz: Int) {
          x = x + dx
          y = y + dy
          z = z + dz
          println ("Point x location : " + x);
          println ("Point y location : " + y);
          println ("Point z location : " + z);
       }
    }
    object Demo {
       def main(args: Array[String]) {
          val loc = new Location(10, 20, 15);
          // Move to a new location
          loc.move(10, 10, 5);
       }
    }