如何将新功能“注入”Elixir语言本身的现有模块?

时间:2017-09-07 06:52:36

标签: elixir

Elixir语言本身具有以下模块,其中包含一些方法:

defmodule Calendar.ISO do
  @spec leap_year?(year) :: boolean()
  @impl true
  def leap_year?(year) when is_integer(year) and year >= 0 do
    rem(year, 4) === 0 and (rem(year, 100) > 0 or rem(year, 400) === 0)
  end
end

假设我在自己的玩具Elixir / Phoenix应用程序中编写自己的模块,我决定在Calendar.ISO中添加另一个名为“frog_day”的方法,该方法返回字符串“frog”。显然,我不想让“frog_day”的公关进入Elixir语言库。

我如何在Calendar.ISO模块中注入此内容以便在我的玩具应用中使用?或者这甚至可能吗?

注意:我意识到这可能会被称为“猴子修补”,但我确实有一个特定的用例。

1 个答案:

答案 0 :(得分:5)

你没有。

由@matov 链接的答案中显示的expand的黑客应该必须避免(特别考虑到,链接的答案不能达到你想要的效果。)多态性Elixir正在完成Protocols和/或Behaviours。在您的情况下,您也不需要多态性,只需实现自己的帮助程序,如:

defmodule Extensions.Calendar.ISO do
  def frog_day?(day), do: "frog"
end

你们都已经准备好了。甚至尝试将方法放在外部模块中也没有没有一个单一优势(并且由于模块目前已经编译,因此您不能首先使用它。)