Elixir 如何在不引起警告的情况下提供函数的默认实现?
我想提供一个Elixir 如何在不引起警告的情况下提供函数的默认实现?,elixir,Elixir,我想提供一个LibraryModule,如下所示: defmodule ClientModule do use LibraryModule end ClientModule.do_something # should work 我希望LibraryModule提供do\u something/0的默认实现,只需在ClientModule中定义即可覆盖该实现。然而,当我现在这样做时,我得到一个编译器警告:“这个子句不能匹配,因为在X行的前一个子句总是匹配的” 好像是GenServer做的,
LibraryModule
,如下所示:
defmodule ClientModule do
use LibraryModule
end
ClientModule.do_something # should work
我希望LibraryModule
提供do\u something/0
的默认实现,只需在ClientModule
中定义即可覆盖该实现。然而,当我现在这样做时,我得到一个编译器警告:“这个子句不能匹配,因为在X行的前一个子句总是匹配的”
好像是GenServer
做的,但我不知道怎么做。使用deforridable
使用
高度简化的代码段:
defmacro __using__(_) do
quote do
def init(args) do
{:ok, args}
end
defoverridable [init: 1]
end
end
使用可除雾的
使用
高度简化的代码段:
defmacro __using__(_) do
quote do
def init(args) do
{:ok, args}
end
defoverridable [init: 1]
end
end
特别针对您的情况,类似于:
图书馆模块
客户端模块
iex>
使用库模块
将使用宏调用\u\u\u\u\u\u\u/1
宏,然后引用的代码部分被注入到客户端模块中
,因此
ClientModule
获取do\u something/0
回调函数的默认实现
使用
宏的\uu在编写库时非常有用
新客户端模块
iex
特别针对您的情况,类似于:
图书馆模块
客户端模块
iex>
使用库模块
将使用宏调用\u\u\u\u\u\u\u/1
宏,然后引用的代码部分被注入到客户端模块中
,因此
ClientModule
获取do\u something/0
回调函数的默认实现
使用
宏的\uu在编写库时非常有用
新客户端模块
iex
在有人问:是的,我问了,同时回答了这个问题。并且有一个内置的复选框来做这件事。在回答之前没有看到评论!在有人问:是的,我问了,同时回答了这个问题。并且有一个内置的复选框来做这件事。在回答之前没有看到评论!可从哪个版本获得?可从哪个版本获得?
defmodule ClientModule do
use LibraryModule
end
ClientModule.do_something()
# "Didn't do much but still"
defmodule NewClientModule do
use LibraryModule
def do_something(), do: "Something else"
end
NewClientModule.do_something()
# "Something else"