こんにちは!ぐちです。
今回はコード中心に(※いつもや!!というツッコミを想像しながら)個人的に「へー、おもしろいなぁ」と思ったプチ情報をご紹介します。
前回のVol.7はこちらからどうぞ。
比較演算子
JavaでもScalaでも比較演算子ってよく使いますよね?
Javaであれば、等価比較する際に==やequals()を使いますが、これちゃんと理解して使っている方ってどれぐらいいらっしゃるのでしょうか?実はけっこう奥が深いみたいですよ。Scalaであれば==やeqなどですね。
しかも!ScalaとJavaでも結果が異なるということで、下記のコードをご覧ください。
Java
public class Main {
public static void main(String[] args) {
System.out.println(1 == 1);
System.out.println("abc" == "abc");
System.out.println("abc".equals("abc"));
System.out.println("abc" == new String("abc"));
System.out.println("abc".equals(new String("abc")));
}
}
上記を実行すると下記の結果が出力されます。
true true true false true
Javaで注意しないといけないことは、プリミティブ型と上記でいうと文字列のリテラルの場合は値の比較ですが、参照型の場合はインスタンス自体が比較されるということですね。コードの下2つがその例です。
Scala
では、続きましてScalaを見てみましょう。
object Main {
def main(args: Array[String]): Unit = {
println(1 == 1)
// println(1 eq 1) // これはエラーになる
println("abc" == "abc") //
println("abc" eq "abc")
println("abc" == new String("abc"))
println("abc" eq new String("abc"))
}
}
これを実行すると下記のようになります。
true true true true false
この結果を見て「おもしろいな〜。」と思える人は変態です。笑
Scalaでは、==を使うと値比較を行いますが、文字列もクラスも値も全て同じです。インスタンスの比較にはeqを使います。ということで、Javaとは同じ結果にならないみたいですね。
Scala深いぞ〜!!
では今回はこの辺で。