Elixir函数中的元组或关键字列表

时间:2015-12-17 15:39:24

标签: functional-programming elixir

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

这样我可以完全避免使用大括号,并且我正在使用关键字列表来实现它们的目的:传递选项/参数。

这种方法有什么问题吗?还是我违反了一些最佳做法?

1 个答案:

答案 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

这样,如果您需要更改服务器实现,客户端上的任何内容都不需要更改。