【问题标题】:Tuples or Keyword Lists in Elixir functionsElixir 函数中的元组或关键字列表
【发布时间】:2015-12-18 00:30:09
【问题描述】:

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

这样我可以完全避免大括号,并且我使用关键字列表似乎是为了他们的目的:传递选项/参数。

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

【问题讨论】:

    标签: functional-programming elixir


    【解决方案1】:

    Keyword Lists 是 2 项元组的列表。所以[set_number: 999] 等价于[{:set_number, 999}]

    元组通常用于这些情况,因为它们比关键字列表更通用。关键字列表仅限于 2 项元组,在某些情况下您想要传递 3 项元组(或更多)。考虑存储GenServer 的键值对的情况。要存储一个值,您需要以{:put, key, value} 的形式传递一个三项元组。

    “完全避免大括号”不应该是所用数据类型的决定因素。另请注意,客户端不应该知道服务器实现,因此,您通常会定义客户端 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)
    

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

    【讨论】:

    • 是的,你说得对,我正在暴露原始内脏,但正如我所提到的,我正在阅读一本书,并且在我写了这个问题之后进行了重构:)跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    • 2019-11-18
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多