2011-06-28 24 views
12

Mathematica'da bir değer Null olup olmadığını sınamak için en iyi/en temiz/önerilir yolu nedir? Ve boş değil? ÖrneğinMathematica'da Boş Değil ve Boş Değil Sınama

:

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

bir sonucu vardır:

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

bu 2 f [b].

+13

İtiraz testinizde Equal yerine SameQ (===) kullanın. –

+0

Bu böyle yapar! Eşit aynı. Neden bir fark olduğunu kontrol etmeliyim. –

+4

Bu konuyu burada ele alıyorum: http://www.mathprogramming-intro.org/book/node24.html –

cevap

12

olarak Daniel tarafından işaret (ve Leonid'in kitabında açıklanmıştır) True veya False ya değerlendirmek değil Null == 0, böylece (yazılı olarak) If bildiride de değerlendirin. Null, çıktıda görüntülenmeyen özel bir Symbol özelliğidir, ancak diğer tüm yollarda normal, günlük bir sembol gibi davranır.

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

bazı tanımsız sembol x için, x sonradan sıfır olabilir çünkü x == 0, False dönmek istemiyoruz. Bu yüzden Null == 0 da değerlendirmiyor.

1) Kuvvet testi TrueQ veya SameQ kullanarak değerlendirmek için:

Bunun iki olası düzeltmeler vardır.
n == Null testi için, aşağıdakiler eşdeğerdir, ancak sayısal nesneleri test ederken bunlar olmayacaktır. (Equal sayısal denklik için yaklaşık bir test kullanır olmasıdır.) Istediğiniz gibi yukarıdaki kullanarak

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

, koşullu önerme çalışır:

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

2) Kullanım isteğe bağlı 4 argüman Test unevaluated kalırsa döndürülür If

g[n_] := If[n == Null, 1, 2, 3] 
(o ne True ne de False yani eğer)

Sonra

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

diğer olasılık iki DownValues, özel durum Null için bir tane ve olağan tanımı sahip olmaktır. Bu, ikinci sırada Null için endişelenmenize gerek olmaması avantajına sahiptir.

f[Null] := 1 

f[x_] := x^2 (* no weird Null^2 coming out of here! *) 
İlgili konular