2016-11-15 68 views
0

我對原子以及如何使用它們感到困惑。學習藥劑和對原子感到困惑

說實話,我閱讀文檔,只是不理解原子:(

有人可以提供一些例子或東西會解釋一下嗎?

感謝

+0

你來自哪種語言?根據您之前的經驗,向您解釋這個概念可能會更容易一些。 –

+0

我知道javascript – user1354934

回答

4

你可能只是過度思考原子只是一個數值,就像truefalse只是數值,你現在有任何可以用作數值的單詞,實際上true,falsenil只不過是原子底下的原子。

而不是作爲內部消息在應用程序周圍傳遞字符串,可以傳遞原子。而不是使用字符串作爲地圖或關鍵字列表的鍵,你可以使用原子。

原子有一個非常大的警告,他們從來沒有垃圾收集,所以你不應該從編程的方式,從用戶輸入或其他方式產生原子,否則你冒着溢出虛擬機如果太多創建。

您可以創建的最大原子數量默認爲1,048,576。 http://erlang.org/doc/efficiency_guide/advanced.html

下面是一些例子:https://github.com/itsgreggreg/elixir_quick_reference#atom

+0

那你能解釋一下嗎?既然他們從來沒有收集過垃圾,那麼你如何處理一個你得到大量原子的情況呢?就像我正在做消息流並使用原子作爲密鑰?謝謝 – user1354934

+0

Elixir/Erlang永遠不會自動生成原子,你必須自己動手。如果您正在接受輸入並將其轉換爲原子,則有可能導致虛擬機崩潰,這就是爲什麼您不會將輸入轉換爲原子的原因。 – greggreg

5

因爲這個問題不是具體的,我就舉一個例子使用。

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),那麼它將返回一個錯誤。這因此允許我們對這個結果進行模式匹配。因此,我們可以肯定,我們將始終有返回給我們的行,並且從來沒有一個零值(因爲它會引發錯誤)。將多種方法連接在一起時,這變得非常有用。

有關原子的一般信息,結帳以下鏈接:

Elixir School

Stack overflow Question

5

http://elixir-lang.org/getting-started/basic-types.html#atoms

原子是常量,他們的名字是自己的價值。其他一些 語言稱爲這些符號

因此,如果您來自主流語言,它們最像常量。但更類似於全球使用的枚舉(即,它們像獨立數據類型一樣)。通常你介紹他們作爲對要匹配的目標,所以他們的名字的東西,你的代碼需要的一些概念

真/假是一個經典案例

:ok:error是別的東西,你會看到

你可能想:red, :green, :blue,或:yes, :no, :maybe:up, :down, :left, :right如果這些概念是很重要的代碼明智的(像2D遊戲)

4

原子是:

  • 不可改變像在藥劑
  • 值等: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的函數callcast將等待您的handle_函數中的這些特定原子)。你將收到的大多數消息(不是警告和錯誤)將是原子,例如。 IO.puts「hi」將打印hi並返回:ok