2012-04-08 14 views
12

私はいつもaがnull参照ではないことを確認するためにScalaのa.ne(null)と!= nullの違いは何ですか?

a != null 

を使用してきました。しかし、今私は別の方法を使用して会った:

a.ne(null) 

どのように良いとはどのように違いますか?

+1

私はスカラについてはわかりませんが、nullかどうかわからない場合は、一般的にオブジェクトのメソッドを呼び出すのは良くありません。多くの言語では、これは 'NullPointerException'を引き起こします。 – yoshi

+1

@yoshi:これはScalaでは当てはまりませんが、実際には 'null.eq(null)'は完全に有効で 'true'を返します(' ne'は!(this eq that) ')を意味します) – Jack

+0

あなたの特定の質問:http://stackoverflow.com/questions/7055299/whats-the-difference-between-null-last-and-null-eq-​​last-in-scala – assylias

答えて

12

@ジャックと同様にx ne null!(x eq null)に等しい。 x != nullx ne nullの違いは、!=が値の等しいかどうかをチェックし、neが参照の同等性をチェックするということです。

例:前記@drexinと@Jackに加え

scala> case class Foo(x: Int) 
defined class Foo 

scala> Foo(2) != Foo(2) 
res0: Boolean = false 

scala> Foo(2) ne Foo(2) 
res1: Boolean = true 
+1

したがって、実際には 'ヌル」、違いはないよね? –

+1

違いがあります。 '!='はオーバーライドでき、 'ne'はオーバーライドできません。また 'ne'は参照をチェックし、'!= 'は他のものをチェックするかもしれません。 – drexin

+0

しかし、実際には私にとってはまだ明らかではありません。文字列の引数をnullでないようにチェックするにはどうすればよいですか:!=またはne? – Ivan

5

neAnyRefで定義され、唯一の参照タイプが存在します。

scala> "null".ne(null) 
res1: Boolean = true 

scala> 1.ne(null) 
<console>:5: error: type mismatch; 
found : Int 
required: ?{val ne: ?} 
Note that implicit conversions are not applicable because they are ambiguous: 
both method int2Integer in object Predef of type (Int)java.lang.Integer 
and method intWrapper in object Predef of type (Int)scala.runtime.RichInt 
are possible conversion functions from Int to ?{val ne: ?} 
     1.ne(null) 

scala> 1 != null 
res2: Boolean = true 
+0

"参照型のみに存在する" Scalaには値の型があるのですか? – Ivan

+1

ええと、[はい](http://www.scala-lang.org/api/current/scala/AnyVal.html) –

関連する問題