gpt4 book ai didi

elixir - 如何将 "inject"新函数添加到 Elixir 语言本身的现有模块中?

转载 作者:行者123 更新时间:2023-12-02 08:11:52 25 4
gpt4 key购买 nike

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”的 PR 放入 Elixir 语言存储库。

我该如何将其注入(inject) Calendar.ISO 模块以用于我的玩具应用程序?或者这甚至可能吗?

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

最佳答案

你不知道。

必须避免使用@matov should 链接的答案中显示的 expand 进行黑客攻击(特别要考虑到,链接的答案不会做你想要的。 ) Elixir 中的多态性是通过 Protocols 完成的和/或 Behaviours .在您的情况下,您也不需要多态性,只需实现您自己的助手,例如:

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

一切就绪。甚至尝试将方法放在外部模块中都没有任何单一优势(而且你不能首先这样做,因为此时模块已经编译。)

关于elixir - 如何将 "inject"新函数添加到 Elixir 语言本身的现有模块中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46089717/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com