“我怎么能?”;注入;在Elixir语言本身的现有模块中添加新函数?
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
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)。看一看,我认为这是接近你所寻找的。猴子修补是明确禁止在长生不老药。