Есть ли в 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 в качестве аргументов?

12 голосов | спросил Kit Ko 21 PM000000120000005931 2015, 12:19:59

2 ответа


0

Оператор сплат отсутствует. Функции в Elixir (и Erlang) определяются по их имени и арности (String.downcase/1, Enum.member?/2) и переменная функция пошла бы против этого.

Это упоминание одного из авторов Erlang Джо Армстронга в его книге «Программирование Erlang: Программное обеспечение для параллельного мира»:

  

1) арность функции является частью ее имени и
  2) нет переменных функций.

Если вы хотите вызвать функцию со списком аргументов (противоположным тому, что вы хотите), можете использовать Kernel.apply /3 .

например.

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

apply(Test, :add, [1, 2, 3])
ответил Gazler 21 PM000000120000001431 2015, 12:24:14
0

Вы не можете указать переменную арность для функций в Elixir (или Erlang), как сказал Газиер. Самое простое, что нужно сделать, это передать список вместо параметра, число которого вы хотите изменить, и затем использовать сопоставление с образцом для его правильной декомпозиции. Учитывая ваш пример выше, это будет выглядеть так:

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  

Примечание: я не тестировал этот код, потому что не хочу устанавливать фарфор, но он должен быть корректным.

ответил Onorio Catenacci 24 PM000000110000000031 2015, 23:51:00

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132