【发布时间】:2016-09-24 08:32:46
【问题描述】:
是否可以在没有__using__/1 功能的模块中添加新功能?
例如,我想在 Phoenix.Tracker 中添加get_meta_by_key 函数。如果我和
defmodule MyApp.MyTracker do
use Phoenix.Tracker
def get_meta_by_key(..., topic, key)
...
end
handle_call(:get_meta_by_key, ..., state)
...
end
end
然后我得到** (UndefinedFunctionError) undefined function Phoenix.Tracker.__using__/1
我想在内存中分发键值存储以保留一些临时值,但不知道如何在不重新发明轮子和不使用 Phoenix.Tracker.list 函数的情况下做到这一点,然后处理完整列表调用方。
我是 Elixir/Phoenix 的新手,所以如果我的问题很愚蠢,请原谅。
【问题讨论】:
-
或许你想看看这个问答:stackoverflow.com/questions/35302208/…
-
@OnorioCatenacci,非常感谢这一点!但是我找不到正常的方法来实现很少的添加(实际上是几行代码)而不分叉现有的模块(然后在支持和升级它时遇到很大的麻烦)。经过多年的 OOP 之后,切换到函数式的方式并不容易,但此刻我什至无法想象如何以简单有效的方式实现我的需求。
-
@OnorioCatenacci 当然,我可以制作一个“更高级别”的函数,它可以处理从 Tracker 返回的完整列表,但我认为这不是一种有效的方法:如果我理解正确,这将在每次通话时复制整个列表。
-
我不会假设它会在每次通话时复制整个列表。事实上,我会假设完全相反。我假设指向列表的指针每次都会以静默方式传递。但这就是我。如果您要求使用“函数式”方式来扩展行为,则高阶函数是执行此操作的常规方式。
-
顺便说一下,我不会根据假设更改代码。我会首先尝试获取经验数据,然后如果我有经验证据,那么我会更改我的代码以处理出现的任何问题。猜测性能是过早的优化。