簡體   English   中英

在Elixir中打開模塊?

[英]Open modules in Elixir?

Ruby有開放的類,非常方便(雖然受到一些人的譴責),Elixir大量借用Ruby,所以我希望Elixir允許我重新打開一個模塊並在關閉后添加宏,但這不起作用我試過的方式。 有辦法做到這一點嗎? Elixir中是否提供此功能?

為了具體化,讓我們以Chris McCord的Metaprogramming Elixir為例:

defmodule Math do
  defmacro say({:+, _, [lhs, rhs]}) do 
    quote do
      lhs = unquote(lhs)
      rhs = unquote(rhs)
      result = lhs + rhs
      IO.puts "#{lhs} plus #{rhs} is #{result}"
      result
    end
  end

  defmacro say({:*, _, [lhs, rhs]}) do 
    quote do
      lhs = unquote(lhs)
      rhs = unquote(rhs)
      result = lhs * rhs
      IO.puts "#{lhs} times #{rhs} is #{result}" 
      result
    end 
  end
end

如果我然后添加一個宏用於減法

defmodule Math do
  defmacro say({:-, _, [lhs, rhs]}) do
    quote do
      lhs    = unquote(lhs)
      rhs    = unquote(rhs)
      result = lhs - rhs
      IO.puts "#{lhs} minus #{rhs} is #{result}"
      result
    end
  end
end

我得到一個警告,我正在重新定義模塊Math,並且最初定義的宏會失敗。 顯然我的方法不是正確的方法,但是有另一種方法可以實現同樣的目標嗎?

您無法重新打開模塊。 由於Elixir是一種編譯語言,從源代碼到可執行表示的方式是單向的。 在編譯期間會評估更改代碼的機制,例如宏。 但是,Elixir允許您進行熱代碼交換,即您可以在運行時替換已編譯的模塊。

我認為這有一些有趣的含義。 您可以在運行時更改程序 - 實際上,您可以控制源代碼,這樣您就可以更換模塊的各個部分而無需更改其他部分。 不過,我喜歡把所有東西放在一個地方的想法。 在Elixir中,當你看一個模塊時,你確切地知道你有什么*。

因此,如果這個問題僅僅是關於一個方便的開發工作流程 - 最接近Ruby的方法是將類添加到類中的方法是將模塊保存在文件中並隨時從iex重新編譯它。


*嚴格來說,只需查看模塊,您可能無法確切知道正在運行的代碼。 當您使用協議時,您還需要查看所有協議實現,這些實現可能分散在整個代碼庫中,或者更糟糕的是,它們可能分布在多個應用程序中。

暫無
暫無

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

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