Skip to content

Instantly share code, notes, and snippets.

@fschuindt fschuindt/example.md Secret
Created Nov 20, 2019

Embed
What would you like to do?

This is a example on pattern matching.

Given the Map/Hash input:

input = %{name: "Alice Foo", points: 100, email: "alicefoo@myemail.com"}

The goal is to determine the user rank, by its points:

  • 0..50 -> Starter
  • 50..200 -> Member
  • >200 -> Veteran

The code in Elixir using pattern matching:

defmodule Rank do
  @moduledoc """
  Offers means to perform user ranking computations.
  """

  @typedoc """
  A user rank.
  """
  @type rank :: :starter | :member | :veteran

  @doc """
  Finds the rank of a given user.
  """
  @spec find(%{points: integer()}) :: rank()
  def find(%{points: n}) when n <= 50, do: :starter
  def find(%{points: n}) when n <= 200, do: :member
  def find(_user), do: :veteran
end

Here's how you use it:

iex(1)> Rank.find(input)
:member

The same code in Ruby:

class Rank
  # Offer means to perform ranking computations.

  # Finds the rank of a given user.
  def self.find(user)
    case user[:points]
    when 0..50
      :starter
    when 50..200
      :member
    else
      :veteran
    end
  end
end

And running it:

irb(main):001:0> Rank.find(input)
=> :member

Patter matching makes the code more elegant, expressive and easier to read.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.