Functional programming Elixir函数中的元组或关键字列表
本书第221页指出,如果我们想将Functional programming Elixir函数中的元组或关键字列表,functional-programming,elixir,Functional Programming,Elixir,本书第221页指出,如果我们想将调用中的多个值传递给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_numb
调用中的多个值传递给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
通过这种方式,我可以完全避免大括号,我使用关键字列表的目的似乎是:传递选项/参数
这种方法有什么问题吗?或者我违反了一些最佳实践?是两项元组的列表。所以[set\u number:999]
相当于[{:set\u number,999}]
元组通常用于这些情况,因为它们比关键字列表更通用。关键字列表仅限于2项元组,在某些情况下,您希望传递3项元组(或更多)。考虑键值存储<代码> GEnServer < /代码>的情况。要存储值,需要以{:put,key,value}
的形式传递一个3项元组
“完全避免大括号”不应该是所使用数据类型的决定因素。还要注意的是,客户机不应该知道服务器实现,因此,您通常定义一个客户机API
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
,您只需调用:
iex > MyModule.set_number(pid, 999)
这样,如果您需要更改服务器实现,那么客户端的任何内容都不需要更改。是的,您是对的,我正在公开原始的内部内容,但正如我所提到的,我正在阅读一本书,重构是在我写了以下问题之后进行的:)