#3 Scalaで学ぶ演算子の基本
Scalaの演算子には、他の言語とは少し違った、面白い裏側の仕組みがあります。この記事では、Scalaの基本的な演算子と、その独自の考え方について解説します。
算術演算子・比較演算子
Scalaでは、次のような演算子を使います。
+-*/%算術演算子==!=><比較演算子&&||!論理演算子
Scalaの==は、文字列同士でも中身を正しく比較してくれます。
演算子の正体は「メソッド」
Scalaの大きな特徴は、+のような演算子が、実は特別な記号ではなく「メソッド」という関数の一種として扱われている点です。例えばa + bという書き方は、実際にはa.+(b)と同じ意味を持っています。
val a = 3
val b = 5
println(a + b) // 8
println(a.+(b)) // 8(同じ意味)
この仕組みにより、Scalaでは自作のデータ型に対して独自の演算子の振る舞いを定義することもできます。
case class Point(x: Int, y: Int) {
def +(other: Point): Point = Point(x + other.x, y + other.y)
}
val p1 = Point(1, 2)
val p2 = Point(3, 4)
println(p1 + p2) // Point(4,6)
+という名前のメソッドを自分で定義するだけで、独自のクラス同士を+で足し合わせられるようになります。
整数の割り算は切り捨てになる
Scalaでも、整数型同士の割り算は小数点以下が切り捨てられます。小数の結果が欲しい場合は、どちらかの値をDouble型にする必要があります。
Scalaならではの注意点
「演算子がメソッドである」という考え方は、最初は少し不思議に感じるかもしれません。しかし、これはScalaが持つ「あらゆるものを一貫した仕組みで扱う」という設計思想の表れです。この考え方に慣れると、Scalaの他の機能も理解しやすくなります。ただし、なんでも演算子として定義できるからといって多用すると、記号の意味が直感的に分からないコードになりがちなので、標準的な意味から大きく外れない範囲で使うのがよいでしょう。
複合代入演算子
「変数に加算してから代入し直す」処理をまとめて書ける複合代入演算子も使えます。
var count = 0
count += 1 // count = count + 1 と同じ
ただしvalで宣言した変数は再代入できないため、複合代入演算子も使えません。この点は以前の記事で触れたval・varの使い分けと関係しています。
まとめ
Scalaの演算子は見た目こそ他の言語と同じですが、内部的にはメソッドとして扱われているという独自の仕組みを持っています。自作クラスに独自の演算子を定義できることも含め、この考え方を知っておくとScalaならではの奥深さが見えてきます。
本ページはプロモーションを含みます。
参考書籍(PR)
Scalaをもっと学びたい方には「実践Scala入門」がおすすめです。
PR
コードを書かずに自動化したい方へ
「学んだけど自分の作業に組み込む時間がない」という方向けに、ダブルクリックで動く Windows専用の自動化ツールをオーダーメイドで作成しています。気になる方は こちらをご覧ください。
コメント
コメントを投稿