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函数?
答案 0 :(得分:20)
没有splat运算符。 Elixir(和Erlang)中的函数由它们的名称和arity(Desroyer
,String.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
注意:我没有测试这段代码,因为我不想安装瓷器,但基本上应该是正确的。