02-09-2015, 12:22 PM
Et voilà une version qui me satisfait beaucoup plus. J'en ai profité pour enlever le franglais (Adresse.is_equal ...)
defmodule Adresse do
defstruct numero: nil, rue: nil, ville: nil
def new(n, r, v), do: %Adresse{numero: n, rue: r, ville: v}
def identique?(%Adresse{numero: x, rue: r1, ville: v1}, %Adresse{numero: x, rue: r2, ville: v2}) do
meme_rue?(r1,r2) and meme_ville?(v1,v2)
end
def identique?(_, _), do: false
def meme_rue?(a, b), do: lccomp(a, b)
def meme_ville?(a, b), do: lccomp(a, b)
defp lccomp(a, b), do: String.downcase(a) === String.downcase(b)
end
defimpl String.Chars, for: Adresse do
def to_string(a), do: "n° #{a.numero} rue #{a.rue} à #{a.ville}"
end
adresse_de_jean = Adresse.new(4, "de la mairie", "Paris")
adresse_de_bob = Adresse.new(44,"de Napoléon","Paris")
adresse_de_jeanne = Adresse.new(4, "de la mairie", "PARIS")
IO.puts "Jean habite au #{adresse_de_jean}"
IO.puts adresse_de_jean === adresse_de_bob
IO.puts adresse_de_jean === adresse_de_jeanne
IO.puts Adresse.identique?(adresse_de_jean, adresse_de_jeanne)
Code :
Jean habite au n° 4 rue de la mairie à Paris
false
false
true