2026/08/17

erlang 的 == 與 =:=

erlang 的相等比較有兩種 == 與 =:= 。同樣都是相等,但比較的嚴格等級不同。

==

這是等值比較,如果比較的是整數跟浮點數,兩種不同的資料型別,在比較之前,會自動做型別轉換,然後再根據數值進行比較。

> 1 == 1.0.
true
> 1 == 1.
true

=:=

全等比較,除了數值要一樣,資料型別也必須要一樣。

> 1 =:= 1.0.
false
> 1 =:= 1.
true

pattern matching

erlang 的 pattern matching 行為比較接近 =:=

假設有這樣的一個 function

check_num(1) -> integer;
check_num(1.0) -> float.

在呼叫 chech_num(1.0) 的時候,會進入第二個 clause,不會進入第一個。因為 1 跟 1.0 是不同的資料型別

/= 與 =/=

不相等,也一樣有兩種寫法

  • /=:對應於 ==。若值在算術上不相等,則為 true

  • =/=:對應於 =:=。若值或型別任一不同,則為 true

>  1 /= 1.0.
false
> 1 =/= 1.0.
true

Term Ordering

在 erlang 的所有資料型別,都能夠直接比較大小,這是因為在處理集合的排序時,能夠得到一個固定的結果。資料型別的比較順序如下

number < atom < reference < fun < port < pid < tuple < map < list < bitstring

sample

> 999999 < apple.
true
> Mixed = [apple, 10, {test, 1}, [1,2,3], 5.5, "hello"].
[apple,10,{test,1},[1,2,3],5.5,"hello"]
> lists:sort(Mixed).
[5.5,10,apple,{test,1},[1,2,3],"hello"]
% 順序:數字(5.5, 10) < atom(apple) < tuple({test,1}) < list([1,2,3], "hello")

Summary

要確保資料比對正確,大部分的狀況都是要寫成 =:=,僅有少部分,遇到了整數跟浮點數必須混合比較時,才需要用到 ==。

沒有留言:

張貼留言