The most interesting addition to Ruby 2.3.0 is the Safe Navigation Operator(
&.
). A similar operator has been present in C# and Groovy for a long time with a slightly different syntax –?.
. So what does it do?
Ruby ayant déjà la possibilité d’avoir des ?
dans le nom des méthodes, il n’y avait pas de syntaxe super classe. Les discussions que j’avais vu tournaient autour de a.?b
mais ça devenait moche si la méthode terminait déjà par ?
: a.?b?
.
Au final nous aurons trois syntaxes :
a && a.b && a.b.c a.try(:b).try(:c) a&.b&.c
La première est ultra verbeuse et retournera false
si a
ou b
retourne false
. Sauf à ruser avec des variables temporaires, on finit par appeler a
trois fois et b
deux fois.
La seconde méthode est plus sympa, mais longue assez moche à la lecture. Elle est aussi ultra tolérante et n’échouera pas même si rien ne retourne nil
ou false
mais que les méthodes b
ou c
n’existent pas.
La dernière née est donc plus stricte. Elle ne sert que si a
ou b
retournent nil
, et dans aucun autre cas. Restera à s’habituer à la syntaxe.
Attention, nil&.nil?
retourne nil
. L’opérateur &
a donc la priorité sur ce qui suit. C’est logique, mais c’est un coup à se planter si on en fait pas attention.
Sinon, spécifiquement pour les Hash
, même logique avec la méthode dig
, là aussi bienvenue :
a[:b] && a[:b][:c] && a[:b][:c][:d] a[:b].try(:[], :c).try(:[], :d) a.fetch(:b, []).fetch(:c, []).fetch(:d, nil) a.fetch(:b, nil)&.fetch(:c, nil)&.fetch(:d, nil) a.dig(:b, :c, :d)
Laisser un commentaire