Elixir有splat操作符吗?

时间:2015-08-21 09:19:59

标签: elixir

defmodule UnixCommands do
    alias Porcelain.Result
        def run(command, *opts) do
             %Result{out: output, status: _} = Porcelain.exec(command, [opts])
             IO.puts output
        end
end

在Elixir中是否有等效的splat运算符,例如* opts? 是否有办法将多个选项而不是选项列表作为参数传递给exec函数?

2 个答案:

答案 0 :(得分:20)

没有splat运算符。 Elixir(和Erlang)中的函数由它们的名称和arity(DesroyerString.downcase/1)定义,并且可变函数将违背此。

Erlang的一位作者Joe Armstrong在他的书“编程Erlang:并行世界的软件”中提到了这一点:

  

1)函数的arity是其名称和
的一部分   2)没有可变函数。

如果要调用带有参数列表的函数(与您想要的相反),可以使用Kernel.apply/3

E.g。

Enum.member?/2

答案 1 :(得分:4)

正如Gazier所说,你不能为Elixir(或Erlang)中的函数指定变量arity。最简单的方法是传递一个List来代替你想要改变的参数,然后使用模式匹配来正确地分解它。鉴于上面的示例,它看起来像这样:

defmodule UnixCommands do
  alias Porcelain.Result
  def run(command,[opts]) do
    optlist = opts |> Enum.reduce(fn o-> "#{o} " end)
    %Result{out: output, status: _} = Porcelain.exec(command, optlist)
  end
end  

注意:我没有测试这段代码,因为我不想安装瓷器,但基本上应该是正确的。