Pattern Matching in Elixir

Published September 24, 2018 by Toran Billups

Earlier this year I started learning Elixir but for whatever reason I didn't blog about it or write much software to document the learning process. In the past when I would learn something new I'd jump into code and build something straight away. This time around I decided to stretch myself and learn only by reading about the language, platform and ecosystem.

I'm finally making my way back to the language after a few months off and decided I would blog about my experience. I'll be reading the programming elixir 1.6 book from Dave Thomas and taking notes. Unlike my previous writing style I plan to make this go round less formal so I can focus more on the language and my journey through it.

Pattern Matching

The equals operator in Elixir is not about assignment, but rather matching. It succeeds if Elixir can find a way to make the left side equal the right side.

    a = 1

Elixir can make the match true by binding the variable `a` to value 1

    a = 1
    1 = a
    2 = a

The last statement above results in a match error. it's like asserting 2 = 1

Also, Elixir will only change the value of the variable on the left side of an equal sign.

    list = [1, 2, 3]
    [a, b, c] = list

Variables will bind only once per match

    [a, a] = [1, 1]
    [b, b] = [1, 2]

The last statement above results in a match error because `b` cannot have 2 different values.

After you assign a variable the value will never change (immutability at work). But you will find that Elixir lets you re-bind that variable.

    a = 1
    [a, b, c] = [3, 2, 1]

You could force Elixir not to re-bind a variable by using the pin operator.

    [^a, b, c] = [3, 2, 1]

This statement would result in a match error if `a` was already assigned the value of 1

    [^a, b, c] = [1, 2, 3]

This statement would NOT result in a match error if `a` was already assigned the value of 1

Buy Me a Coffee

Twitter / Github / Email