正如丹尼尔所指出的(并在列昂尼德的书中解释)Null == 0
不评估为True
or False
, 所以If
语句(如书面形式)也不评估。Null
是一个特殊的Symbol
它不会在输出中显示,但在所有其他方面都像正常的日常符号一样。
In[1]:= Head[Null]
Out[1]= Symbol
对于一些未定义的符号x
,你不想要x == 0
回来False
, since x
稍后可能为零。这就是为什么Null == 0
也不评价。
有两种可能的修复方法:
1)强制测试评估使用TrueQ
or SameQ
.
为了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
nor False
)
g[n_] := If[n == Null, 1, 2, 3]
Then
In[5]:= {g[Null], g[0]}
Out[5]= {1, 3}