2017-09-26 54 views
2

我偶然發現了一些我不太明白的代碼。它看起來像這樣:Erlang - 幫助理解基本的erlang代碼

% spawn process which waits for a message and prints it 
Pid = spawn(fun() -> 
    receive 
    X -> io:fwrite("I received: ~p~n", [X]) 
    end 
end), 
% send a message to the new process 
Pid ! {message, "Hello"}. 

在最後一行中,是「消息」,即在模塊中定義的原子?我無法真正理解那部分。我試圖理解它會是這樣的:我們把事情保存在元組描述內容的元組中。例如:{celsius, 55}。不太清楚的是原子消息沒有在模塊中定義。你需要定義它嗎?沒有聲明是必要的,所以我想你在使用它之前不必定義原子。我對麼?

感謝您的幫助!代碼是here

+1

是的。原子通常是文字。遇到時它們會添加到原子表中。在另一種啓用GC的語言中使用字符串的方式來使用它們。在erl中運行代碼並查看!它比張貼在這裏更有趣。 – zxq9

回答

3

正確 - 你只是隨意使用原子。他們沒有被「定義」在任何地方。

+0

像這樣使用它們很好,但請記住:https://stackoverflow.com/a/20518160/4366224 –

+0

謝謝!還要感謝關於原子內存泄漏的鏈接。非常豐富! – Arian

0

原子可以隨意使用,每個獨特的原子將被輸入到一個原子表中。原子表從未被垃圾收集。 ERTS實例的默認最大原子計數爲1048576.可以通過在啓動時使用+ t選項來增加此限制。 more information regarding limits。出於診斷目的,您可以使用erlang:memory(atom) - elrang:memory(atom_used)調用,以確保您沒有耗盡可用的原子。如果原子耗盡,它會立即終止ERTS而不會發出警告。

0

Basicaly,你理解正確。你可以使用你想要的所有原子,它們沒有在任何地方定義。除了一些「特殊詞」Erlang:

receive, case, if, throw, catch, else...