[Ruby] Lorsque l'opérateur conditionnel continue deux fois (ou plus)

Déclencheur

Lorsque je n'ai pas réussi à installer une gemme auparavant, je cherchais la cause et suis arrivé au code suivant, mais l'opérateur conditionnel est apparu deux fois sur une ligne et a demandé "Dans quelles conditions cela fonctionne-t-il?" Je n'ai pas compris, alors prenez note.

idirs = idir ? Array === idir ? idir.dup : idir.split(File::PATH_SEPARATOR) : []

https://github.com/ruby/ruby/blob/master/lib/mkmf.rb#L1780

Conclusion

Il est évalué dans l'ordre de l'extérieur vers l'intérieur.

irb


> 1 == 1 ? 2 == 2 ? "a" : "b" : "c"
=> "a"
# 1 ==Puisque 1 est vrai, ""a" : "b"" Quand: "c"Et ""a" : "b"」,Puis 2==Parce que 2 est vrai"a" : "b"Est"a"

> 1 == 1 ? 2 == 0 ? 3 == 3 ? "a" : "b" : "c" : "d"
=> "c"

> 1 == 0 ? 2 == 0 ? 3 == 3 ? "a" : "b" : "c" : "d"
=> "d"

Ce que j'ai confirmé

Je n'ai pas trouvé le document à la fois, j'ai donc décidé de faire une analyse syntaxique. J'ai aussi regardé Ripper, mais parser était facile à voir pour les débutants.

console


% ruby-parse -e 'puts 1 == 1 ? 2 == 2 ? "a" : "b" : "c"'
(send nil :puts
  (if
    (send
      (int 1) :==
      (int 1))
    (if
      (send
        (int 2) :==
        (int 2))
      (str "a")
      (str "b"))
    (str "c")))

En regardant le résultat analysé, il semble que le 1 == 1 interne soit évalué en premier, et le résultat dépend de" a ":" b ": " c " " a ":" b " reste. Avec le résultat, nous procédons à l'évaluation de 1 == 1, et" a " reste pour le reste"a": "b".

référence

<a target = "_ blank" href = "https://www.amazon.co.jp/gp/product/B01IGW56CU/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B01IGW56CU&linkCode=as2&tag=kureda70-2210 > Fonctionnement de Ruby Ruby sous un microscope

Recommended Posts

[Ruby] Lorsque l'opérateur conditionnel continue deux fois (ou plus)
Branche conditionnelle de Ruby. if, opérateur conditionnel (opérateur ternaire), sauf si, cas
Quand le terminal Ruby on Rails revient en arrière