回答
你可能只是過度思考原子只是一個數值,就像true
和false
只是數值,你現在有任何可以用作數值的單詞,實際上true
,false
和nil
只不過是原子底下的原子。
而不是作爲內部消息在應用程序周圍傳遞字符串,可以傳遞原子。而不是使用字符串作爲地圖或關鍵字列表的鍵,你可以使用原子。
原子有一個非常大的警告,他們從來沒有垃圾收集,所以你不應該從編程的方式,從用戶輸入或其他方式產生原子,否則你冒着溢出虛擬機如果太多創建。
您可以創建的最大原子數量默認爲1,048,576。 http://erlang.org/doc/efficiency_guide/advanced.html
下面是一些例子:https://github.com/itsgreggreg/elixir_quick_reference#atom
那你能解釋一下嗎?既然他們從來沒有收集過垃圾,那麼你如何處理一個你得到大量原子的情況呢?就像我正在做消息流並使用原子作爲密鑰?謝謝 – user1354934
Elixir/Erlang永遠不會自動生成原子,你必須自己動手。如果您正在接受輸入並將其轉換爲原子,則有可能導致虛擬機崩潰,這就是爲什麼您不會將輸入轉換爲原子的原因。 – greggreg
因爲這個問題不是具體的,我就舉一個例子使用。
Elixir中一個流行的原子使用方法是將它們用作模式匹配的消息。例如,你可以使用某種處理http請求的函數。這個處理的結果要麼是成功的過程,要麼是失敗的過程。
因此,您可以使用原子來指示此處理是否成功。例如。
def process(file) do
lines = file |> split_lines
case lines do
nil ->
{:error, "failed to process file"}
lines ->
{:ok, lines}
end
end
這裏我們說的方法,process/1
將返回一個二元組應答。如果我們處理的結果是成功的,它將返回{:ok, lines}
,但是如果失敗(例如返回nil),那麼它將返回一個錯誤。這因此允許我們對這個結果進行模式匹配。因此,我們可以肯定,我們將始終有返回給我們的行,並且從來沒有一個零值(因爲它會引發錯誤)。將多種方法連接在一起時,這變得非常有用。
有關原子的一般信息,結帳以下鏈接:
從http://elixir-lang.org/getting-started/basic-types.html#atoms
原子是常量,他們的名字是自己的價值。其他一些 語言稱爲這些符號
因此,如果您來自主流語言,它們最像常量。但更類似於全球使用的枚舉(即,它們像獨立數據類型一樣)。通常你介紹他們作爲對要匹配的目標,所以他們的名字的東西,你的代碼需要的一些概念
真/假是一個經典案例
:ok
,:error
是別的東西,你會看到
你可能想:red, :green, :blue
,或:yes, :no, :maybe
或:up, :down, :left, :right
如果這些概念是很重要的代碼明智的(像2D遊戲)
原子是:
- 不可改變像在藥劑
- 值等
:patryk
或:true
(因爲true
實際上是:true
) - 在紅寶石
- 非常適合在地圖鍵類似的符號,因爲使很好的語法來訪問地圖元素 一切
- 使您能夠使用關鍵字列表 - 列表,這些列表實際上是元組列表,但更容易訪問消息通信的基礎。與GenServer
原子在地圖
地圖而不原子可以像創建:
map = %{"author" => "patNowak"}
和訪問
map["author"]
> "patNowak"
地圖與原子作爲鍵可以創建更容易:
map = %{author: "patNowak"} # but %{:author => "patNowak"} still works
和訪問:在關鍵字列表
map.author # as well as map[:author]
> "patNowak"
凌
關鍵字列表實際上是元組的列表(S):
list = [author: "patNowak"]
list === [{:author, "patNowak"}]
> true
而且可以訪問:
list[:author] # no dot notation in this case
消息中的原子
GenServer在某些情況下默認使用:reply
或:noreply
(GS的函數call
和cast
將等待您的handle_
函數中的這些特定原子)。你將收到的大多數消息(不是警告和錯誤)將是原子,例如。 IO.puts「hi」將打印hi
並返回:ok
。
- 1. 對Frustum Culling感到困惑
- 2. 對OAuth感到困惑
- 3. Rails學習的困惑
- 4. 感到困惑EKEventStatus
- 5. 對ES6對象語法感到困惑
- 6. 我對C++入門(流程執行)練習感到困惑
- 7. 初學者對目標c,作業,屬性等感到困惑
- 8. 學習Python困難的方法,練習20,困惑功能
- 9. 學習C#和方法內的對象令我困惑
- 10. 在Spring Boot中對ThymeleafConfig感到困惑
- 11. 對Firebase查詢執行感到困惑
- 12. 我對Hibernate感到困惑嗎?
- 13. 對DocumentDB訪問鍵感到困惑
- 14. 對Ruby長度屬性感到困惑
- 15. 對箭頭功能感到困惑
- 16. ServiceStack:對路線感到困惑
- 17. 對返回類型感到困惑
- 18. 對類方法語法感到困惑
- 19. 我對Hibernate Spring感到困惑
- 20. 對JTable的setDefaultRenderer方法感到困惑
- 21. 對條紋降級感到困惑
- 22. 對linq這個查詢感到困惑
- 23. 對Java8中的HashMap感到困惑
- 24. 對ios觸摸代碼感到困惑
- 25. 對使用XPath感到困惑
- 26. 我對java代碼感到困惑嗎?
- 27. 對米勒拉賓感到困惑
- 28. 對AngularUI模態文檔感到困惑
- 29. 對UIView框架屬性感到困惑
- 30. 對Silverlight導航感到困惑
你來自哪種語言?根據您之前的經驗,向您解釋這個概念可能會更容易一些。 –
我知道javascript – user1354934