2011-06-28 26 views
12

Mathematicaで値がNullであるかどうかをテストするには最高の/最もクリーンな方法が勧められますか?そして、Nullではない?例えばMathematicaでヌルとヌルでないことをテストする

:F 2の[B]こと思っただろう

1 
If[0 == Null, 1, 2] 

a = Null 
b = 0; 
f[n_] := If[n == Null, 1, 2] 
f[a] 
f[b] 

結果を有しています。

+13

述語テストでは、Equalの代わりにSameQ(===)を使用します。 –

+0

それはそうです!同じです。なぜ違いがあるのか​​を確認する必要があります。 –

+4

私はここでこのトピックをカバーしています:http://www.mathprogramming-intro.org/book/node24.html –

答えて

12

としても評価しない(書かれた)Null == 0TrueまたはFalse、そうIf文のいずれかに評価されないダニエルが指摘(とレオニードの本で説明しました)。 Nullは、出力には表示されない他のすべての方法で、通常の毎日のシンボルのように機能する特別なSymbolです。いくつかの未定義のシンボルxについては

In[1]:= Head[Null] 
Out[1]= Symbol 

xが、後にゼロになる可能性があるので、あなたは、x == 0Falseを返すようにしたくありません。このため、Null == 0も評価されません。

1)フォーステストがTrueQまたはSameQを使用して評価する:

は、このための2つの可能な修正があります。
n == Nullテストの場合、以下は同等ですが、数値オブジェクトをテストする場合はそうではありません。 (Equal数値同等のおおよそのテストを使用しているためです。)あなたが望んでいたとして、上記を使用して

f[n_] := If[TrueQ[n == Null], 1, 2] (* TrueQ *) 
f[n_] := If[n === Null, 1, 2]   (* SameQ *) 

は、条件文が機能:

In[3]:= {f[Null], f[0]} 
Out[3]= {1, 2} 

2)使用のオプションの第四引数Ifが返されます(つまり、値がTrueでもFalseでもない場合)

その後

In[5]:= {g[Null], g[0]} 
Out[5]= {1, 3} 
6

別の可能性としては2 DownValues、特殊な条件のヌルのための1つ、および通常の定義を持つことです。これは、2番目のものでNullを心配する必要がないという利点があります。

f[Null] := 1 

f[x_] := x^2 (* no weird Null^2 coming out of here! *) 
関連する問題