How to change default arguments?

Hello friends
I have a code like the one below

defmodule Test do
  def send(receptor, template, token, token2 \\ nil, token3 \\ nil, token10 \\ nil, token20 \\ nil) do
    params = %{
      "receptor" => receptor,
      "token" => token,
      "token2" => token2,
      "token3" => token3,
      "token10" => token10,
      "token20" => token20,
      "template" => template
    }

    IO.inspect(params)
  end
end

Test.send("111", "222", "333", "444")

out

%{
  "receptor" => "111",
  "template" => "222",
  "token" => "333",
  "token10" => nil,
  "token2" => "444",
  "token20" => nil,
  "token3" => nil
}

How can I change token10?
I want to print this as well as I entered, I first introduced token2 and then token10 but it is arranged in the output

Thanks

You can see this example in php
Named arguments

function Test(string $receptor, string $template, string $token, string $token2 = null, string $token3 = null, string $token10 = null, string $token20 = null)
{
    $params = [
        "receptor" => $receptor,
        "token" => $token,
        "token2" => $token2,
        "token3" => $token3,
        "token10" => $token10,
        "token20" => $token20,
        "template" => $template,
    ];

    print_r($params);
}

Test(receptor:"111", template:"222", token:"333", token10:"444");

out

Array
(
    [receptor] => 111
    [token] => 333
    [token2] => 
    [token3] => 
    [token10] => 444
    [token20] => 
    [template] => 222
)

Maps are not ordered. If you need to maintain order of keys then you need to look at a keyword list in elixir, which are much closer to PHP using arrays to fake maps.

1 Like

It is true
And how do I give “444” to token10?
in php:

Test(token10:"444")

Thanks

If you can deal with atom keys instead of strings, you can do something like this:

defmodule Test do
  def send(receptor, template, token, opts \\ []) do
    params = [
      receptor: receptor,
      token: token,
      token2: opts[:token2],
      token3: opts[:token3],
      token10: opts[:token10],
      token20: opts[:token20],
      template: template
    ]
    IO.inspect(params)
  end
end

Test.send("111", "222", "333", token10: "444")

which outpus

[
  receptor: "111",
  token: "333",
  token2: nil,
  token3: nil,
  token10: "444",
  token20: nil,
  template: "222"
]
2 Likes