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
Run Code Online (Sandbox Code Playgroud)
假设我在自己的玩具Elixir/Phoenix应用程序中编写自己的模块,我决定在Calendar.ISO中添加另一个名为"frog_day"的方法,该方法返回字符串"frog".显然,我不想让"frog_day"的公关进入Elixir语言库.
我如何在Calendar.ISO模块中注入这个以便在我的玩具应用程序中使用?或者这甚至可能吗?
注意:我意识到这可能会被称为"猴子修补",但我确实有一个特定的用例.
你没有.
应该避免使用expand@matov链接的答案中显示的黑客(特别是考虑到,链接的答案不能达到你想要的效果.)Elixir中的多态性正在和/或.在您的情况下,您也不需要多态性,只需实现自己的帮助:ProtocolsBehaviours
defmodule Extensions.Calendar.ISO do
def frog_day?(day), do: "frog"
end
Run Code Online (Sandbox Code Playgroud)
而你已经准备好了.即使尝试将方法放在外部模块中也没有任何一个优势(并且由于模块目前已经编译,因此您不能首先使用该方法.)