Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“我怎么能?”;注入;在Elixir语言本身的现有模块中添加新函数?_Elixir - Fatal编程技术网

“我怎么能?”;注入;在Elixir语言本身的现有模块中添加新函数?

“我怎么能?”;注入;在Elixir语言本身的现有模块中添加新函数?,elixir,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 e

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
假设我在自己的toy Elixir/Phoenix应用程序中编写自己的模块,我决定在Calendar.ISO中添加另一个名为“frog_day”的方法,该方法返回字符串“frog”。显然,我不想在Elixir语言库中为“frog_day”做公关

我将如何将其注入Calendar.ISO模块,以便在我的玩具应用程序中使用?或者这可能吗

注意:我意识到这可能会被理解为“猴子补丁”,但我确实有它的特定用例。

你没有

必须避免使用@matov链接的答案中所示的
expand
进行黑客攻击(尤其要考虑到链接的答案不符合您的要求)。Elixir中的多态性是使用和/或完成的。在您的情况下,您也不需要多态性,只需实现您自己的助手,如:

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

你们都准备好了。甚至尝试将该方法放在一个外部模块中都没有任何一个好处(首先,您不能这样做,因为该模块目前已经编译好了。)

您需要创建一个扩展Calendar.ISO的新模块(即MyCalendar)。看一看,我认为这是接近你所寻找的。猴子修补是明确禁止在长生不老药。