2015-08-21 27 views
11
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函数作为参数?Elixir中是否有一个图示操作符?

回答

18

没有图示操作符。 Elixir(和Erlang)中的函数由它们的名称和参数(String.downcase/1,Enum.member?/2)定义,并且可变参数函数将与此相反。

这是提到由二郎作者乔·阿姆斯特朗在他的一本书“编程二郎:对于并发世界软件”:

1)函数的参数数量是其名称的一部分
2)没有可变参数的功能。

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

E.g.

defmodule Test do 
    def add(a, b, c) do 
    a + b + c 
    end 
end 

apply(Test, :add, [1, 2, 3]) 
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 

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

相关问题