前回、ドワンゴのScala研修資料のScalaの基本を読み進めていた。
そのままなぞっているだけだが意外に長くなってたので今回はその続き。
変数の基本
ということで変数の基本から。
変数val
Scalaの変数val
の宣言は以下。
scala> val x = 3 * 2 x: Int = 6
C言語みたいに型の指定は必要なく型推定が働く。
このあたりはperlとかpythonチック。
上で定義したx
をString
型として扱うとエラーになるらしい。
ということでやってみる。
scala> val x = 3 * 2 x: Int = 6 scala> x = "string" <console>:12: error: reassignment to val x = "string"
確かにエラーが返ってきた。
ん??違うか。エラーメッセージは再代入不可って言ってる気がする。
と思って読み進めたらval
は再代入不可と書いてあった。
Cとかのconst
の扱いか。Javaではfinalな変数というらしい。
ということで改めて再代入が可能なもうひとつの変数宣言var
で試してみる。
変数var
先ほどのval
の代わりにvar
にするだけ。
scala> var x = 1 x: Int = 1
Int
型をString
型へ
scala> var x = 1 x: Int = 1 scala> x = "String" <console>:12: error: type mismatch; found : String("String") required: Int x = "String" ^
Int
型をLong
型へ
アップキャスト的な動きはどうだろうと思い試してみる。
scala> var x = 1 x: Int = 1 scala> x = 1L <console>:12: error: type mismatch; found : Long(1L) required: Int x = 1L ^
Int
型をDouble
型へ
結果は同じだ取ろうけど一応、Int
型をDouble
型へ。
scala> var x = 1 x: Int = 1 scala> x = 1.0 <console>:12: error: type mismatch; found : Double(1.0) required: Int x = 1.0 ^
Long
型をInt
型へ
逆はどうだろう。
scala> var x = 1L x: Long = 1 scala> x = 1 x: Long = 1
なるほど、これは包含されてるからOKなのか。
計算するときに複数の型が混ざるのはどうなんだろう。
scala> x = x + 1.0 <console>:12: error: type mismatch; found : Int required: ?{def +(x$1: ? >: Double(1.0)): ?} Note that implicit conversions are not applicable because they are ambiguous: both method int2long in object Int of type (x: Int)Long and method int2float in object Int of type (x: Int)Float are possible conversion functions from Int to ?{def +(x$1: ? >: Double(1.0)): ?} x = x + 1.0 ^ <console>:12: error: overloaded method value + with alternatives: (x: Int)Int <and> (x: Char)Int <and> (x: Short)Int <and> (x: Byte)Int cannot be applied to (Double) x = x + 1.0 ^
なんかいっぱい出た。
前回の記事で出てきたasInstanceOf
は??
scala> x = 1 x: Int = 1 scala> x = x.asInstanceOf[Double] + 1.0 <console>:12: error: type mismatch; found : Double required: Int x = x.asInstanceOf[Double] + 1.0 ^
なんか怒られた。
ひとまず、結構厳し目だということがわかってればいいので、この辺の挙動はおいおい調べることにしよう。
変数の型の指定
変数名の後ろの: <型名>
を付ければ、型指定が可能とのこと。
scala> var x : Double = 1 x: Double = 1.0
確かにDouble
型になった。
練習問題
- ¥3,950,000を年利率2.3%の単利で8か月間借り入れた場合の利息はいくらか(円未満切り捨て)
この解答
scala> var x : Double = 3950000 * 0.023 / 12 * 8
x: Double = 60566.666666666664
scala> x.asInstanceOf[Int]
res1: Int = 60566
asInstanceOf
は通るのか。ということで¥60,566が答え。
- 定価¥1,980,000の商品を値引きして販売したところ、原価1.6%にあたる¥26,400の損失となった。割引額は定価の何パーセントであったか
答えは0.18で18%。解答
scala> var x = 26400 / 0.016
x: Double = 1650000.0
scala> x = x - 26400
x: Double = 1623600.0
scala> x = 1980000 - x
x: Double = 356400.0
scala> x = x / 1980000
x: Double = 0.18
これでScalaの基本は終了。