みーのぺーじ

みーが趣味でやっているPCやソフトウェアについて.Python, Javascript, Processing, Unityなど.

Booで比較は==を使っとけ

Booの比較演算子には、==,is,isaの3つがあります。

  • ==は値が等しいか
  • isは同じオブジェクトを参照しているか
  • isaはクラスが同じかどうか 

といってもややこしい!ので、サンプルを。これはUnityで動作します。

import UnityEngine

class test (MonoBehaviour): 
    def Start ():
        a=0
        b=0
        Debug.Log( a == b ) # True
        Debug.Log( a == 0 ) # True
        #Debug.Log( a is b ) #  "is" can"t be used with a value type ("int")
        #Debug.Log( a is 0 ) #  "is" can"t be used with a value type ("int")

        c="abc"
        d=c
        Debug.Log( c == d)   # True
        Debug.Log( c == "abc")  # True
        Debug.Log( c == "a"+"b"+"c") # True
        Debug.Log( c is d) # True
        Debug.Log( c is "abc") # True
        Debug.Log( c is "a"+"b"+"c") # False

実はこれ最後以外全部Trueを返します。

18行目で、cと"abc"を比較するときに、"abc"は新しく宣言されるstringなので、別の参照先となるのでFalseが返ってくる!という初心者泣かせな現象は今の時代ではありえなくて、実は新しく宣言された"abc"は前の"abc"インスタンスが再利用されるのです。コンパイラは優秀なのです。しかし、優秀なコンパイラも19行目で"a"+"b"+"c"とすると、別の"abc"を生成するので、参照先は最初の"abc"とは別になります。最終的に、最後だけがFalseとなります。

文字列を代表する参照型の比較をする場合は==を利用しましょう。

数値はisが使用できないので、==を使います。

まとめると、普通の用途なら、Booでは==で比較をしよう!となります。