Skip to content

Instantly share code, notes, and snippets.

@fschuindt fschuindt/ Secret
Created Nov 20, 2019

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: ""}

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

Here's how you use it:

iex(1)> Rank.find(input)

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
    when 50..200

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.