ハードウェアの気になるあれこれ

技術的に興味のあることを調べて書いてくブログ。主にハードウェアがネタ。

Scalaの勉強 - 基本的な文法(2)

スポンサーリンク

前回、ドワンゴScala研修資料のScalaの基本を読み進めていた。
そのままなぞっているだけだが意外に長くなってたので今回はその続き。

tech-diningyo.hatenablog.com

変数の基本

ということで変数の基本から。

変数val

Scalaの変数valの宣言は以下。

scala> val x = 3 * 2
x: Int = 6

C言語みたいに型の指定は必要なく型推定が働く。
このあたりはperlとかpythonチック。
上で定義したxString型として扱うとエラーになるらしい。
ということでやってみる。

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型になった。

練習問題

    1. ¥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. 定価¥1,980,000の商品を値引きして販売したところ、原価1.6%にあたる¥26,400の損失となった。割引額は定価の何パーセントであったか

解答

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

答えは0.18で18%。

これでScalaの基本は終了。