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
-> Starter50..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.
just to niggle - your code doesn't consider negative numbers :D