2014-12-27 65 views
1

我在學習erlang,並試圖理解原子的概念。我知道Python,簡單來說,這些「原子」的解釋是什麼,或者類似於python。到目前爲止,我的理解是,它就像一個字符串,但沒有字符串操作?erlang原子的簡單解釋

+0

Python沒有任何相似之處。 – rightfold 2014-12-27 13:23:25

+0

@rightføld我明白了。我現在修改了我的問題。 – yayu 2014-12-27 13:24:44

回答

1

Atom是一個字面常量。沒有價值,但可以用作價值。例子是:true,false,undefined。如果你想使用它作爲一個字符串,你需要應用atom_to_list(atom)來獲得一個字符串(列表)來處理。模塊名稱也是原子。 看看http://www.erlang.org/doc/reference_manual/data_types.html

+0

原子確實有一定的價值。所以foo的值是foo,bar是bar等。erlang shell是一個REPL,當你輸入一個原子時,它會對它進行評估並打印結果,原子本身就是它的值。它與數字和其他原子數據類型一樣,他們自己評估它們。 – rvirding 2014-12-29 13:05:52

+0

感謝羅伯特的澄清! – zsoci 2014-12-30 22:25:26

1

此外,他們經常用於標記元組,以描述性。例如:

{年齡,42}

而不是僅僅

1

Docs說:

一個原子是文字,具有名稱的常數。

有時你有幾個選項,你可以選擇。在C例如,你有enum

enum Weekday { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }; 

在C,它確實是一個整數,但你可以使用它在代碼的選項之一。 Erlang中的原子在模式匹配中非常有用。讓我們考慮非常簡單的服務器:

loop() -> 
    receive 
     {request_type_1, Request} -> 
      handle_request_1(Request), 
      loop(); 
     {request_type_2, Request} -> 
      handle_request_2(Request), 
      loop(); 
     {stop, Reason} -> 
      {ok, Reason}; 
     _ -> 
      {error, bad_request} 
    end. 

您的服務器接收郵件時,有兩個元素的元組,並使用原子不同類型的請求進行區分:request_type_1request_type_2stop。它被稱爲模式匹配。

服務器也使用原子作爲返回值。原子的意思是說,一切都很順利。 _匹配所有內容,以防萬一,那個簡單的服務器收到意想不到的東西,它會退出元組{error, Reason},其原因也是原子bad_request

布爾值truefalse也是原子。您可使用功能的條款是這樣的邏輯功能:

and(true, true) -> 
    true; 
and(_, _) -> 
    false. 

or(false, false) -> 
    false; 
or(_, _) -> 
    true. 

(這是一個有點過於簡單,因爲你可以這樣調用:or(atom1, atom2),它將返回true,但它僅用於說明)

在二郎

模塊名稱也原子,這樣你就可以在模塊名稱綁定變量,並調用它,例如在二郎殼鍵入:

io:format("asdf"). 
Variable = io. 
Variable:format("asdf"). 

你不應該使用原子作爲字符串,因爲他們不垃圾公司llected。如果您開始動態創建它們,則可能會導致內存不足。只有在有固定數量的選項時,才應使用它們,以便手動輸入代碼。當然,您可以根據需要多次使用相同的原子,因爲它始終指向內存中的同一個點(原子表)。

它們比C枚舉更好,因爲該值在運行時已知。因此,在調試C代碼時,您將在調試器中看到1而不是Tuesday。使用原子沒有這個缺點,你會在你的代碼和Erlang shell中看到tuesday