ScalaをRead Eval Print Loop(REPL)を使って対話形式で実行した。
$ sbt console
でScalaをREPLで実行できる。
scala> println("Hello, World!")
Hello, World!
scala> "Hello, World!"
res1: String = Hello, World!
文字列だけを入力すると型Stringが表示された。Scalaは静的な型を持つ。プログラム実行前に型があっているか調べられるということ。
scala> 0xff
res2: Int = 255
0xは16進数を示す。16進数が10進数で表示された。
scala> 1e308
res3: Double = 1.0E308
Doubleの範囲内の数
scala> 9223372036854775807L
res4: Long = 9223372036854775807
64bitの整数
scala> 9223372036854775808L
<console>:1: error: integer number too large
9223372036854775808L
Long型の範囲を超えているのでエラーになった。
scala> 9223372036854775807
<console>:1: error: integer number too large
9223372036854775807
Long型を示すLがないのでエラーになった。
scala> 922337203685477580.7
res5: Double = 9.2233720368547763E17
少数点がつくとDouble型の範囲内
scala> 1.00000000000000000001 == 1
res6: Boolean = true
scala> 1.000000000000001 == 1
res20: Boolean = false
Doubleなどの浮動小数点数は近似された値で表現されるためtrueになる。
scala> "\u3042"
res7: String = あ
scala> "\ud842\udf9f"
res8: String = 𠮟
文字コードを入力している。
+
-
*
/
%
などが使える。
dbl.asInstanceOf[Int]
で型の変換ができる。
scala> 4.5/2
res25: Double = 2.25
scala> (res25).asInstanceOf[Int]
res26: Int = 2
scala> 2147483647 +1
res29: Int = -2147483648
scala> 9223372036854775807L + 1
res30: Long = -9223372036854775808
型の最大値を超えると最小値になった。調べたところ言語によって挙動は違うらしい。
#変数
Scalaには2種類の変数があり、valは一度変数に値を入れると変更できない。varは変更ができる。基本的にvalが使われる。また、varでもvalでも型を宣言しなくてもコンパイラが型を推論してくれる。pythonと似てる。
scala> var x = 3*3
x: Int = 9
scala> x = "Hello"
<console>:12: error: type mismatch;
found : String("Hello")
required: Int
x = "Hello"
^
変数の型を宣言することもできる。
scala> val x: Int = 4*4
x: Int = 16
練習問題
Q. ¥3,950,000を年利率2.3%の単利で8か月間借り入れた場合の利息はいくらか(円未満切り捨て)
scala> val x = 3950000 * 0.023 / 12 * 8
x: Double = 60566.666666666664
scala> val y = (x).asInstanceOf[Int]
y: Int = 60566
Q. 定価¥1,980,000の商品を値引きして販売したところ、原価1.6%にあたる¥26,400の損失となった。割引額は定価の何パーセントであったか
scala> val x = 100*(1-((26400/0.016)-26400)/1980000)
x: Double = 18.000000000000004