dylan-chong

dylan-chong

Is there a way to do default named parameters

  def fun(options) do
    [parameter1: parameter1, parameter2: parameter2] = Enum.into(options, parameter1: 1, parameter2: 2)

Is there an alternative to the above very boilerplatey code?

Ideally something like this which is not allowed

  def fun(parameter1: parameter1 \\ 1, parameter2: parameter2 \\ 2) do
  end

Most Liked

deadbeef

deadbeef

Not to necropost, but I came across this post when searching about default parameters. Posting in-case others come across as well.

Elixir 1.13.0 introduced Keyword.validate/2 (and related Keyword.validate!/2). Which I believe is intended to solve this exact problem.
These functions both ensure the keywords passed are well-known (i.e. fails if any are unlisted keywords) and sets defaults for keywords not passed in.

For the original example, I believe this could be written like:

def fun(opts) do
  opts = Keyword.validate!(opts, [parameter1: 1, parameter2: 2])
end

This goes beyond Keyword.merge/2 since it ensures you won’t have a potential superset of arbitrary, unexpected keywords

gregvaughn

gregvaughn

The subject of the thread suggests a misunderstanding. These are not named parameters. They’re a couple of layers of syntactic sugar. In Elixir the last parameter to a function can implicitly be a keyword list. For example:
def my_fun(param1, param2, option1: v1, option2: v2)
Is literally a function of 3 parameters (my_fun/3). The third parameter is [option1: v1, option2: v2], a keyword list.

Furthermore a keyword list, as displayed above, is syntactic sugar for a list of 2 element tuples:
[{:option1, v1}, {:option2, v2}] which the Keyword module can treat in a very map-like way. They do have their idiosyncrasies in that as a list, pattern matching relies on ordering, and that a key can be duplicated. These and a more generalized form (called proplists) have been used in Erlang long before the BEAM added the map datatype.

benwilson512

benwilson512

Author of Craft GraphQL APIs in Elixir with Absinthe

You don’t need the function to Keyword.merge, what you have there is what it defaults to anyway. Thus you can just have

default = [foo: 1, bar: 2]
options = Keyword.merge(default, options)
LostKobrakai

LostKobrakai

Only by using individual function parameters. You can default those. You cannot default inner data of parameters.

dylan-chong

dylan-chong

Thanks for your response. I am aware that named parameters are just syntactic sugar over keyword lists, however the intended usage of the keyword list is to act like named parameters in a language like kotlin, Which has the concept of named parameters with default values (https://try.kotlinlang.org/#/Kotlin%20Koans/Introduction/Named%20arguments/Task.kt).

Where Next?

Popular in Questions Top

albydarned
Hello all! I am typing this post from my new MacBook Pro with the M1 chip. I’m loving it so far, and will probably use it as my daily dr...
New
myronmarston
The Elixir Typespec docs show the following syntax for keyword lists in typespecs: # ... | [key: type] # keyword lis...
New
mgjohns61585
Could someone help me? I'm making my first elixir program, number guessing game. I can't figure out how to convert the user's guess from ...
New
rms.mrcs
Hi, I need to transform a list of numbers into a map where the keys are the indexes and the values are the original values of the list....
New
shahryarjb
Hello, I have map which I want to convert it to string like this: the map: %{last_name: "tavakkoli", name: "shahryar"} the string I ne...
New
ovidiubadita
Hey all, I discovered Elixir and I love it. I always wanted to learn a functional programming and I intended to go for Haskell, but afte...
New
electic
Hi, I am new to Elixir. I am trying to use the DateTime component to insert a date into MySQL however the there seems to be no way to fo...
New
baxterw3b
Hi guys, i’m new in the Elixir world, and i have to say, that i love it! i’m having some problem to understand anonymous functions with ...
New
Patoshizzle
After calling mix ecto.create I get this error: 17:00:32.162 [error] GenServer #PID<0.412.0> terminating ** (Postgrex.Error) FATAL...
New
Mooodi
Given a string, how can I get access to its character by index? Enum.at("my_string", 2) doesn't work. Or rather, not char, but a substr...
New

Other popular topics Top

Brian
What is the proper way to load a module from a file in to IEX? In the python world, doing something like this pretty standard: from ....
New
danschultzer
None of the current solutions worked well for me, so I went ahead and built a user management system from scratch. This project took far...
548 27727 240
New
minhajuddin
I have seen a lot of code which picks the first element from a list using Enum.at(0) instead of List.first. Is there a reason why people ...
New
chensan
I have a User schema with a :from_id field set to type :string: defmodule TweetBot.Repo.Migrations.CreateUsers do use Ecto.Migration ...
New
fayddelight
I tried installing elixir 1.11.2 erlang 23.3.4 via asdf in my zsh shell. Enabled the versions locally and globally. When I list them ...
New
vonH
When I run the Plug and I recompile I wind up having to use Ctrl C to quit iex and start again. Witht the help of rlwrap I can use the cu...
New
stefanluptak
Hello everybody, usually, I use a 29" ultra-wide monitor for VSCode which can easily accomodate explorer (files panel) + file with code ...
New
WestKeys
Currently suffering from paralysis by [HTTP client] analysis. This is rather unusual in Elixirland as there tends to be consensus on the ...
New
belgoros
I’m not a pro in using Regex and can’t figure out why the following behaviour happens, especially if we take into account the difference ...
New
skosch
To my knowledge, put_in, Map.update etc. all have the one limitation of not automatically creating intermediate keys when needed (for exa...
New

We're in Beta

About us Mission Statement