Như đã chỉ ra bởi Daniel (và được giải thích trong sách của Leonid) Null == 0
không đánh giá hoặc True
hoặc False
, do đó, tuyên bố If
(như được viết) cũng không đánh giá. Null
là một đặc biệt Symbol
không hiển thị ở đầu ra, nhưng theo tất cả các cách khác hoạt động như biểu tượng bình thường, hàng ngày.
In[1]:= Head[Null]
Out[1]= Symbol
Đối với một số biểu tượng không xác định x
, bạn không muốn x == 0
trở False
, vì x
có thể là zero sau này. Đây là lý do tại sao Null == 0
cũng không đánh giá.
Có hai bản vá có thể cho điều này:
1) quân sự thử nghiệm để đánh giá sử dụng TrueQ
hoặc SameQ
.
Đối với thử nghiệm n == Null
, điều sau sẽ tương đương, nhưng khi kiểm tra các đối tượng số, chúng sẽ không. (Điều này là do Equal
sử dụng một thử nghiệm gần đúng cho tương đương số.)
f[n_] := If[TrueQ[n == Null], 1, 2] (* TrueQ *)
f[n_] := If[n === Null, 1, 2] (* SameQ *)
Sử dụng trên, báo cáo kết quả điều kiện làm việc như bạn muốn:
In[3]:= {f[Null], f[0]}
Out[3]= {1, 2}
2) Sử dụng đối số thứ 4 tùy chọn của If
được trả lại nếu thử nghiệm vẫn chưa được đánh giá (ví dụ: nếu nó không phải là True
cũng không False
)
g[n_] := If[n == Null, 1, 2, 3]
Sau đó
In[5]:= {g[Null], g[0]}
Out[5]= {1, 3}
Sử dụng SameQ (===) thay vì bằng kiểm tra dự đoán của bạn. –
Điều đó xảy ra! Bằng nhau. Tôi phải kiểm tra tại sao có sự khác biệt. –
Tôi đề cập đến chủ đề này tại đây: http://www.mathprogramming-intro.org/book/node24.html –