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模块中注入此内容以便在我的玩具应用中使用?或者这甚至可能吗?
注意:我意识到这可能会被称为“猴子修补”,但我确实有一个特定的用例。
答案 0 :(得分:5)
你没有。
由@matov 链接的答案中显示的必须避免(特别考虑到,链接的答案不能达到你想要的效果。)多态性Elixir正在完成expand
的黑客应该Protocols
和/或Behaviours
。在您的情况下,您也不需要多态性,只需实现自己的帮助程序,如:
defmodule Extensions.Calendar.ISO do
def frog_day?(day), do: "frog"
end
你们都已经准备好了。甚至尝试将方法放在外部模块中也没有没有一个单一优势(并且由于模块目前已经编译,因此您不能首先使用它。)