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()メソッドを実行した文字列は、この文字列が拘束されていると言います.デフォルトでは、コード内の文字列の字面量と文字列定数の値は、次のように制限されています.
ScalaではSymbolタイプのオブジェクトは拘禁されており、任意の同名symbolsは同じSymbolオブジェクトを指しており、冗長性によるメモリオーバーヘッドを回避しています.Stringタイプでは、コンパイル時に決定された文字列のみが拘束されます.Scalaテストコードは以下の通りです.
両方の結果は同じ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
scalaはtupleオブジェクトをサポートしてオブジェクトを定義します.
scala class
クラスの定義
scala consoleで実行するには、まずコンパイルし、実行する必要があります.
クラスの継承
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);
}
}