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
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"
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"
.
<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