Bah faut pas pousser, faut penser au cas d'utilisation quand même. Qui va comparer deux adresses juste sur le nom de la rue ?
tenez, une implémentation traduite en Elixir. ATTENTION, ce code est de mauvaise qualité, il représente juste un équivalent de la version PHP mais il est beaucoup trop compliqué pour rien. On préfèrera utiliser des variables scalaires au sein de la classe Adresse
(je mets la coloration en ruby pour que ça soit plus joli)
tenez, une implémentation traduite en Elixir. ATTENTION, ce code est de mauvaise qualité, il représente juste un équivalent de la version PHP mais il est beaucoup trop compliqué pour rien. On préfèrera utiliser des variables scalaires au sein de la classe Adresse
(je mets la coloration en ruby pour que ça soit plus joli)
defmodule Adresse do
defmodule Numero do
defstruct numero: nil
def is_equal?(%Numero{numero: x}, %Numero{numero: x}), do: true
def is_equal?(_, _), do: false
end
defmodule Rue do
defstruct rue: nil
def is_equal?(%Rue{rue: r1}, %Rue{rue: r2}) do
String.downcase(r1) === String.downcase(r2)
end
def is_equal?(_, _), do: false
end
defmodule Ville do
defstruct ville: nil
def is_equal?(%Ville{ville: v1}, %Ville{ville: v2}) do
String.downcase(v1) === String.downcase(v2)
end
def is_equal?(_, _), do: false
end
defstruct numero: nil, rue: nil, ville: nil
def new(n, r, v) do
%Adresse{numero: %Numero{numero: n}, rue: %Rue{rue: r}, ville: %Ville{ville: v}}
end
def is_equal?(%Adresse{numero: n1, rue: r1, ville: v1}, %Adresse{numero: n2, rue: r2, ville: v2}) do
Numero.is_equal?(n1, n2) and
Rue.is_equal?(r1, r2) and
Ville.is_equal?(v1, v2)
end
def is_equal?(_, _), do: false
end
defimpl String.Chars, for: Adresse do
def to_string(a), do: "n° #{a.numero} rue #{a.rue} à #{a.ville}"
end
defimpl String.Chars, for: Adresse.Numero do
def to_string(x), do: Kernel.to_string x.numero
end
defimpl String.Chars, for: Adresse.Rue do
def to_string(x), do: x.rue
end
defimpl String.Chars, for: Adresse.Ville do
def to_string(x), do: x.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.is_equal?(adresse_de_jean, adresse_de_jeanne)
Jean habite au n° 4 rue de la mairie à Paris
false
false
true