[Ruby] Wenn der bedingte Operator zweimal (oder öfter) fortgesetzt wird

Auslösen

Als ich zuvor keinen Edelstein installiert habe, habe ich nach der Ursache gesucht und bin zu dem folgenden Code gekommen, aber der bedingte Operator wurde zweimal in einer Zeile angezeigt und gefragt: "Unter welchen Bedingungen funktioniert das?" Ich habe es nicht verstanden, also mach dir eine Notiz.

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

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

Fazit

Es wird in der Reihenfolge von außen nach innen ausgewertet.

irb


> 1 == 1 ? 2 == 2 ? "a" : "b" : "c"
=> "a"
# 1 ==Da 1 wahr ist, ""a" : "b"" Wann: "c"Und ""a" : "b"」,Dann 2==Weil 2 wahr ist"a" : "b"Ist"a"

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

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

Was ich bestätigt habe

Ich konnte das Dokument nicht sofort finden und entschied mich für eine Syntaxanalyse. Ich habe mir auch Ripper angesehen, aber Parser war für Anfänger leicht zu erkennen.

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

Wenn man das analysierte Ergebnis betrachtet, scheint es, dass die innere "1 == 1" zuerst ausgewertet wird und das Ergebnis von "a": "b": "c" "a": "abhängt. b "` bleibt. Mit dem Ergebnis fahren wir mit der Auswertung von "1 == 1" fort, und "a" bleibt für das verbleibende "a": "b".

Referenz

<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&2aa2de > Funktionsweise von Ruby Ruby unter dem Mikroskop

Recommended Posts

[Ruby] Wenn der bedingte Operator zweimal (oder öfter) fortgesetzt wird
Bedingter Zweig von Ruby. if, bedingter Operator (ternärer Operator), es sei denn, case
Wenn das Ruby on Rails-Terminal zurückrollt