簡體   English   中英

Elixir,該程序在做什么?

[英]Elixir, what is this program doing?

我們的老師給了我這個代碼。 我在遵循此代碼的作用時遇到了麻煩。 到目前為止,這就是我所知道的: [x1, y1 | z1] = Output2.abc(3) [x1, y1 | z1] = Output2.abc(3) ,因此函數abc(2)將產生一個分配為y的新進程。 然后它將值2發送到y 當接收到2時,我會陷入接收正在做的事情。 z -> z是什么意思?

另外,教授詢問`x1,y1是什么。 我不明白這些變量在此代碼中的位置。 如果有人可以指導我完成此工作,將不勝感激。 謝謝

defmodule Output2 do
  def abc(x) do
    y = spawn_link(__MODULE__, :n, [self()])
    send y, x
    receive do
      z -> z
    end
  end

  def n(z) do
    receive do
      v -> send z, n(v * v, v)
    end
  end

  defp n(x, x), do: [x]
  defp n(x, y), do: [y | n(x, y + y)]
end

[x1, y1 | z1] = Output2.abc(2)
  1. Output2.abc(2)
  2. 使用n(z)作為接收者,以spawn_link / 3開始一個鏈接過程
    1. 原始進程等待來自最近生成的進程的消息。
  3. 參數x(即2)被發送到#2中開始的進程
  4. 從#2開始的過程發回n(v * v, v)
    1. n(v * v, v)是對n(x, y)的調用n(x, y)因為x和y是不同的值。
    2. 因此,我們有n(2*2, 2) n(x,y)返回與n(x, y+y)串聯的y列表,其中x = 4,y = 2
    3. 從上一步中調用n(4, 2+2) ,調用n(x, x)返回單個項目列表[4]
    4. 從4.2,[2 | [4]]產生[2 | 4](兩個元素的列表:2、4)
  5. 原始進程將列表作為z接收,並返回zz -> z
  6. 模式匹配用於分配x1 = 2,y1 =4。z1是其余部分的尾部,為空。

z -> z就像函數定義: fun(z) {return z}並且z是從接收函數獲得的參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM