Je suis tombé sur cette ligne de code ruby. Qu'est-ce que cela &.
signifie?
@object&.method
Il est appelé l'opérateur de navigation sécurisée. Introduit dans Ruby 2.3.0, il vous permet d'appeler des méthodes sur des objets sans vous soucier que l'objet puisse être nil
(Éviter une undefined method for nil:NilClass
erreur), similaire à la try
méthode de Rails .
Pour que tu puisses écrire
@person&.spouse&.name
au lieu de
@person.spouse.name if @person && @person.spouse
À partir des documents :
my_object.my_method
Cela envoie le message my_method à my_object. Tout objet peut être un récepteur, mais selon la visibilité de la méthode, l'envoi d'un message peut déclencher une NoMethodError.
Vous pouvez utiliser &. pour désigner un receveur, alors my_method n'est pas invoqué et le résultat est nul lorsque le receveur est nul. Dans ce cas, les arguments de my_method ne sont pas évalués.
try!
méthode, pastry
Remarque: Même si @Santosh a donné une réponse claire et complète, je voudrais ajouter un peu plus de contexte et ajouter une note importante concernant son utilisation avec des variables non-instance.
Il est appelé « opérateur de navigation sécurisée » ( alias «opérateur de chaînage facultatif», «opérateur conditionnel nul», etc. ). Matz semble l'appeler "opérateur solitaire". Il a été introduit dans Ruby 2.3 . Il envoie une méthode à un objet uniquement si ce n'est pas le cas
nil
.Exemple:
"Edge case" avec des variables locales:
Veuillez noter que le code ci-dessus utilise des variables d'instance. Si vous souhaitez utiliser un opérateur de navigation sécurisé avec des variables locales, vous devrez d'abord vérifier que vos variables locales sont définies.
Pour résoudre ce problème, vérifiez si votre variable locale est définie en premier ou définissez-la sur nil:
Contexte de la méthode
Rails a une
try
méthode qui fait essentiellement la même chose. Il utilise unesend
méthode en interne pour appeler une méthode. Matz a suggéré qu'il était lent et que cela devrait être une fonctionnalité de langage intégrée.De nombreux autres langages de programmation ont des fonctionnalités similaires: Objective C, Swift, Python, Scala, CoffeeScript, etc. Cependant, une syntaxe commune est
?.
(point de question). Mais, cette syntaxe n'a pas pu être adoptée par Ruby. Parce que cela?
était autorisé dans les noms de méthode et donc, la?.
séquence de symboles est déjà un code Ruby valide. Par exemple:C'est pourquoi la communauté Ruby a dû proposer une syntaxe différente. Ce fut une discussion active et différentes options ont été envisagées (
.?
,?
,&&
, etc.). Voici une liste de quelques considérations:Lors du choix de la syntaxe, les développeurs ont examiné différents cas limites et la discussion est assez utile à parcourir. Si vous souhaitez parcourir toutes les variantes et nuances de l'opérateur, veuillez consulter cette discussion d'introduction des fonctionnalités sur le suivi des problèmes Ruby officiel.
la source
.?
et d'autres options ont été envisagées, mais elles ont&.
été choisies! Donc, seul&.
fonctionnera.&.
et non.?
, mon mal. J'ai mis à jour ma réponse. Merci pour l'information!user.?profile
devrait êtreuser&.profile
(je n'ai pas pu le modifier moi-même car il ne s'agit que d'une modification d'un caractère!).Se méfier! Bien que l'opérateur de navigation sécurisé soit pratique, il peut également être facile de vous inciter à changer votre logique avec lui. Je recommande d'éviter son utilisation dans le contrôle de flux. Exemple:
Dans le premier exemple,
str.nil?
retournetrue
etstr.empty?
n'est jamais appelé, ce qui entraîne l'puts
exécution de l' instruction. Dans le deuxième exemple cependant,str&.empty?
renvoienil
ce qui est faux et l'puts
instruction n'est jamais exécutée.la source
str.nil?
c'est vrai (comme vous le dites), ce qui signifiestr.empty?
ne sera pas du tout appelé (c'est ainsi que fonctionne l'||
opérateur). Le reste de votre déclaration est correct.puts "hello" unless str&.present?
(rails uniquement pour la méthode actuelle?)il a utilisé pour un contrôle nul, comme dans kotlin et swift Par exemple; avec Object -> Swift et Kotlin
ce modèle peut être nul (Swift) ou nul (Kotlin) si nous n'avons pas défini la valeur du modèle dans la classe de voiture. nous utilisons cette esperluette au lieu du point d'interrogation en rubis
si vous utilisez car.model sans esperluette et si le modèle est nul, le système ne peut pas continuer à fonctionner.
la source