我们如何解决 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

例如,我需要在一个模块中同时使用GenServerRaxx.SimpleServer,并且都定义了@callbackhandle_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。当需要互操作时,应该将消息传递给各自的进程。