在Programming Elixir一书的第221页上,如果我们想要将call
中的多个值传递给GenServer
,我们应该使用元组:
def handle_call({:set_number, new_number}, _from, _current_number) do
{ :reply, new_number, new_number }
end
iex> GenServer.call(pid, {:set_number, 999})
在我看来,关键字列表在这种情况下更适合:
def handle_call([ set_number: new_number ], _from, _current_number) do
{ :reply, new_number, new_number + 1 }
end
iex(2)> GenServer.call pid, set_number: 999
这样我可以完全避免使用大括号,并且我正在使用关键字列表来实现它们的目的:传递选项/参数。
这种方法有什么问题吗?还是我违反了一些最佳做法?
答案 0 :(得分:1)
Keyword Lists是2项元组的列表。因此$connection->query (
"SELECT meeting_id,visibility,meeting_start
FROM details
WHERE meeting_start BETWEEN '" . $from . "' AND '" . $to . "'"
);
相当于[set_number: 999]
。
元组通常用于这些情况,因为它们比关键字列表更通用。关键字列表仅限于2项元组,在某些情况下,您希望传递3项元组(或更多)。考虑存储键值[{:set_number, 999}]
的情况。要存储值,您需要以GenServer
的形式传递3项元组。
“完全避免使用大括号”不应该是所使用的数据类型的决定因素。另请注意,客户端不应该知道服务器实现,因此,您通常会定义客户端API。
{:put, key, value}
现在从defmodule MyModule do
use GenServer
#client API
def set_number(pid, number) do
GenServer.call(pid, {:set_number, number})
end
def handle_call({:set_number, new_number}, _from, _current_number) do
{ :reply, new_number, new_number }
end
end
开始,您可以致电:
iex
这样,如果您需要更改服务器实现,客户端上的任何内容都不需要更改。