Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Functional programming Elixir函数中的元组或关键字列表_Functional Programming_Elixir - Fatal编程技术网

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

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

本书第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_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)

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

是的,您是对的,我正在公开原始的内部内容,但正如我所提到的,我正在阅读一本书,重构是在我写了以下问题之后进行的:)