Kann eine Anweisung "if (a == b || c == b)" in Ruby kürzer ausgeführt werden?

8

Ich habe einen Code in Ruby, der wie folgt aussieht:

%Vor%

kann das wie

geschrieben werden %Vor%

Oder so, dass ich b nicht zweimal eingeben muss. Das ist aus Faulheit und ich würde es gerne wissen.

    
Biketire 16.05.2013, 10:21
quelle

6 Antworten

20
%Vor%

Dies ist jedoch deutlich langsamer als der Code, den Sie vermeiden möchten - zumindest solange a , b und c grundlegende Daten sind. Meine Messungen zeigten einen Faktor von 3. Dies ist wahrscheinlich auf die zusätzliche Array -Obbildung zurückzuführen. Also müssen Sie hier TROCKEN gegen Leistung abwägen. Normalerweise sollte das aber egal sein, denn beide Varianten brauchen nicht lange.

    
undur_gongor 16.05.2013, 10:25
quelle
6

Obwohl keine genaue Entsprechung von a == b || a == c , bietet case Anweisung eine Syntax dafür:

%Vor%

Fühlen Sie sich frei, das nächste Ruby-Lehrbuch zu öffnen und lesen Sie, wie case -Anweisung funktioniert. Spoiler: Es funktioniert, indem Sie die Methode #=== für die verglichenen Objekte aufrufen:

%Vor%

Führe jetzt

aus %Vor%

Das gibt Ihnen viel Flexibilität. Es erfordert Arbeit im Back-Office, aber nachdem Sie es tun, sieht aus wie Magie im Front-Office.

    
Boris Stitnicky 16.05.2013 12:35
quelle
3

Sie sollten wirklich wissen, warum das nicht funktioniert:

%Vor%

Das scheint eine Übersetzung des Satzes "a oder c ist gleich b" zu sein, was auf Englisch Sinn macht.

In fast allen Programmiersprachen ist (a || c) ein Ausdruck, dessen Bewertungsergebnis mit b verglichen wird. Die Übersetzung ins Englische ist "Das Ergebnis der Operation" a oder c "ist gleich b" .

    
Otto Allmendinger 16.05.2013 12:35
quelle
0

@ undur_gongors Antwort ist vollkommen richtig. Nur um hinzuzufügen, wenn Sie mit Arrays arbeiten, zum Beispiel:

%Vor%

Sie müssten etwas tun wie:

%Vor%     
Mike Campbell 16.05.2013 11:15
quelle
-1

Acolyte hat darauf hingewiesen, dass du b == (a||c) verwenden kannst, du hast es einfach rückwärts laufen lassen, aber das funktioniert nur für den linken Wert, da (a || c) immer ein ist, vorausgesetzt a ist nicht falsch.

Eine andere Möglichkeit ist die Verwendung eines ternären Operators.

%Vor%

Ich bin mir nicht sicher über den Geschwindigkeitsunterschied, der für den Array-Ansatz angeführt wird, aber ich denke, dass dies schneller sein könnte, da es entweder einen oder zwei Vergleiche durchführt und nicht mit Arrays arbeiten muss. Außerdem nehme ich an, es ist genau dasselbe wie (a == b || b == c), aber es ist eine stilistische Alternative.

    
BWStearns 06.03.2014 00:35
quelle
-1

Was ist damit? wenn [a, c] .index (b)! = nil; setzt "b = a oder b = c"; Ende

    
user3385955 06.03.2014 00:07
quelle

Tags und Links