簡體   English   中英

“@”在 Elixir 中有什么作用?

[英]What does “@” do in Elixir?

我一直在查看一些編碼解決方案,它們顯示了“@”符號; 但是,我似乎無法通過查看文檔來真正弄清楚該符號的作用。

@ 符號在 Elixir 中有什么作用,為什么它很重要?

下面是一個例子:

defmodule RNATranscription do
  @dna_nucleotide_to_rna_nucleotide_map %{
    # `G` -> `C`
    71 => 67,

    # `C` -> `G`
    67 => 71,

    # `T` -> `A`
    84 => 65,

    # `A` -> `U`
    65 => 85
  }

  @doc """
  Transcribes a character list representing DNA nucleotides to RNA

  ## Examples

  iex> RNATranscription.to_rna('ACTG')
  'UGAC'
  """
  @spec to_rna([char]) :: [char]
  def to_rna(dna) do
    dna
    |> Enum.map(&get_rna_for_dna/1)
  end

  defp get_rna_for_dna(dna_nucleotide) do
    @dna_nucleotide_to_rna_nucleotide_map[dna_nucleotide]
  end
end

Elixir 中的@符號表示 模塊屬性,這是有用的編譯時設置。 您經常在可能將類常量放入 OO 語言的地方看到它們。

然而,模塊屬性比您在面向對象語言中可能發現的更微妙。 以下是一些重要的要點:

  1. 它們使用=來分配值(如果您習慣於在 OO-land 中定義類常量,您可能會習慣這樣做)。 語法更像是function input ,其中刪除了可選的括號。

  2. 模塊屬性可以在整個模塊中多次重新定義。 你會經常看到@doc屬性注釋它@spec的函數, @spec注釋函數輸入/輸出,或者在測試內部用@tag更改輸入到它@tag的測試。 這可以提供一種有用的方法來將大值排除在函數邏輯之外以提高可讀性。

  3. 模塊屬性可以累積 通常,屬性的每個實例都會重新分配其值,但是如果您在注冊屬性時設置了accumulate: true ,那么后續定義將進行累加,以便讀取該屬性將返回所有累加值。 從文檔頁面:

defmodule MyModule do
  Module.register_attribute(__MODULE__, :custom_threshold_for_lib, accumulate: true)

  @custom_threshold_for_lib 10
  @custom_threshold_for_lib 20
  @custom_threshold_for_lib #=> [20, 10]
end
  1. 模塊屬性在編譯時評估。 因為它們可以提高對重要的模塊范圍值的可見性,您可能會想做一些類似隱藏 ENV 值的事情:
defmodule Trouble do
  @my_value System.fetch_env("BOOM") # <-- don't do this!
end

如果您嘗試這樣做,更新版本的 Elixir 將顯示警告(並且某些值,例如捕獲的函數,將引發錯誤),因此作為一般經驗法則,最好保持模塊屬性簡單和靜態。

這是 模塊屬性的語法:

Elixir 中的模塊屬性有三個用途:

  1. 它們用於注釋模塊,通常包含用戶或 VM 使用的信息。
  2. 它們作為常量工作。
  3. 它們用作編譯期間使用的臨時模塊存儲。

屬性由編譯器在編譯時讀取,因此無法在運行時訪問或更改。 在運行時,它們將被編譯器評估的任何內容替換。

在您的情況下,此功能:

defp get_rna_for_dna(dna_nucleotide) do
  @dna_nucleotide_to_rna_nucleotide_map[dna_nucleotide]
end

有效地編譯為:

defp get_rna_for_dna(dna_nucleotide) do
  %{
    71 => 67,
    67 => 71,
    84 => 65,
    65 => 85
  }[dna_nucleotide]
end

@spec用於定義類型規范@doc用於文檔。

暫無
暫無

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

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