我们如何解决 Elixir 中的冲突行为警告
How do we resolve conflicting behaviours warnings in Elixir
我们如何解决 Elixir 中的冲突行为警告?
warning: conflicting behaviours found. function handle_info/2 is required by Raxx.Server and GenServer
例如,我需要在一个模块中同时使用GenServer
和Raxx.SimpleServer
,并且都定义了@callback
handle_info
defmodule TestServer
use Raxx.SimpleServer
use GenServer
def handle_info(_, state), do: {:noreply, state}
end
请问有什么 best/recommended 解决方法?
use Raxx.SimpleServer
会自动设置为@behaviour GenServer
,所以你的使用是重复的。删除您的 @behaviour GenServer
(或 Rax.SimpleServer
)行,它将修复您的警告:)
TL;DR: 你不能抑制这个警告,因为你不应该交叉违反行为。 OTOH,这只是一个约定,尽管有警告,代码可能会很高兴 运行。
这肯定是 XY Problem。首先,你应该明确地告诉编译器 handle_info/2
是一个实现:
@impl GenServer # or @impl true
def handle_info(_, state), do: {:noreply, state}
其次,如上所述的设计,即使受到欢迎并且没有产生任何警告,也违反了SRP。
你可能应该做的,是一个带有监督者的监督树,管理两个工人:一个用于 Raxx.SimpleServer
,另一个用于 GenServer
。当需要互操作时,应该将消息传递给各自的进程。
我们如何解决 Elixir 中的冲突行为警告?
warning: conflicting behaviours found. function handle_info/2 is required by Raxx.Server and GenServer
例如,我需要在一个模块中同时使用GenServer
和Raxx.SimpleServer
,并且都定义了@callback
handle_info
defmodule TestServer
use Raxx.SimpleServer
use GenServer
def handle_info(_, state), do: {:noreply, state}
end
请问有什么 best/recommended 解决方法?
use Raxx.SimpleServer
会自动设置为@behaviour GenServer
,所以你的使用是重复的。删除您的 @behaviour GenServer
(或 Rax.SimpleServer
)行,它将修复您的警告:)
TL;DR: 你不能抑制这个警告,因为你不应该交叉违反行为。 OTOH,这只是一个约定,尽管有警告,代码可能会很高兴 运行。
这肯定是 XY Problem。首先,你应该明确地告诉编译器 handle_info/2
是一个实现:
@impl GenServer # or @impl true
def handle_info(_, state), do: {:noreply, state}
其次,如上所述的设计,即使受到欢迎并且没有产生任何警告,也违反了SRP。
你可能应该做的,是一个带有监督者的监督树,管理两个工人:一个用于 Raxx.SimpleServer
,另一个用于 GenServer
。当需要互操作时,应该将消息传递给各自的进程。