Inline-If

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Inline-If

Beitrag von Nino »

STARGÅTE hat geschrieben:@Nino:
>> "Auch wenn man das normale "If" benutzt darf man nicht durch 0 dividieren."
Richtig, aber beim normalen If, frage ich das ja vorher auch ab, ob x<>0 und lasse dann nur 1/x zu!
Ja, sicher. Aber was ich sagen wollte ist, dass du hier an den Fall "x = 0" denken musst, und dich irgendwie darum kümmern musst. Beim Inline-If muss ich das eben auch tun, so what? D.h. in einer Situation in der x = 0 sein kann, würde ich es mit 1/x nicht benutzen. Das waren in meiner bislang über 25-jährigen Programmierpraxis allerdings Ausnahmefälle. Wieso sollte ich nur wegen dieser Ausnahmefdälle das Inline-If generell ablehnen? Man muss immer wissen, welches "Werkzeug" man wo und wie einsetzen kann und darf. Und das gilt eben auch für das normale "If", das wollte ich sagen.
Für das Inline-If gibt es -- wie ich finde -- sehr elegante Anwendungen (s.u.).
mhs hat geschrieben:Im einem anderen Thread (http://purebasic.fr/german/viewtopic.ph ... 0&start=10) hatte ich schon mal meine Variante gepostet. Total simpel, dafür nicht komplett Inline, weil die Result Variable mit als Paramter übergeben werden muss... dafür ohne Performanceverlust, doppelter Ausführung der Expression... ist ja schließlich nur ein simples If : Else :lol:
Ich finde, für diese Variante spricht durchaus einiges.
Allerdings funktioniert einer meiner Lieblingsanwendungsfälle nur mit der anderen Variante, die sich wie eine Funktion aufrufen lässt:

Code: Alles auswählen

selected = 3
StatusBarText(0, 0, Str(selected) + " Datei" + IifS(selected <> 1, "en", "") + " ausgewählt.")
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Inline-If

Beitrag von Sicro »

STARGÅTE hat geschrieben:Speziell geht es um die Problematik, dass beide Zustände (True und False) immer ausgeführt werden
Es gibt zwei Arten von Inline-If:
  • Funktion: wertet beide Zustände aus
  • Operator: wertet nur den zutreffenden Zustand aus
Das selbst gebastelte Inline-If ist die Funktion-Variante, wie sie auch in Visual Basic implementiert wurde (https://en.wikipedia.org/wiki/%3F:#Visual_Basic).
Die Operator-Variante wird wohl nur Fred per native Implementierung realisieren können.
https://en.wikipedia.org/wiki/%3F:#Usage hat geschrieben:Note that some languages may evaluate 'both' the true- and false-expressions, even though only one or the other will be assigned to the variable. This means that if the true- or false-expression contain a function call, that function may be called and executed (causing any related side-effects due to the function's execution), regardless of whether or not its result will be used. Programmers should consult their programming language specifications or test the ternary operator to determine whether or not the language will evaluate both expressions in this way. If it does, and this is not the desired behaviour, then an if-then-else statement should be used.
Nino hat geschrieben:Die numerischew Version lässt sich noch etwas vereinfachen, indem man auf das "Not" verzichtet, und da du in der String-Version für das Trennzeichen eine Variable benutzt, muss es natürlich überall als Variable auftauchen.
Danke für die Hinweise. Ich habe sie im ersten Post übernommen.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
mhs
Beiträge: 224
Registriert: 11.01.2009 16:30
Wohnort: Graben
Kontaktdaten:

Re: Inline-If

Beitrag von mhs »

Nino hat geschrieben:
mhs hat geschrieben:Im einem anderen Thread (http://purebasic.fr/german/viewtopic.ph ... 0&start=10) hatte ich schon mal meine Variante gepostet. Total simpel, dafür nicht komplett Inline, weil die Result Variable mit als Paramter übergeben werden muss... dafür ohne Performanceverlust, doppelter Ausführung der Expression... ist ja schließlich nur ein simples If : Else :lol:
Ich finde, für diese Variante spricht durchaus einiges.
Allerdings funktioniert einer meiner Lieblingsanwendungsfälle nur mit der anderen Variante, die sich wie eine Funktion aufrufen lässt:

Code: Alles auswählen

selected = 3
StatusBarText(0, 0, Str(selected) + " Datei" + IifS(selected <> 1, "en", "") + " ausgewählt.")
Ja, das geht natürlich nicht, deswegen hatte ich es auch "nicht komplett inline" genannt. In solchen Fällen arbeite ich mit einer zusätzlichen Variable. Mir persönlich ist wichtig, dass das If kurz und kompakt in einer Zeile steht, ohne die Ausführungszeit zu verschlechtern oder dass ich mir Gedanken zur doppelten Ausführung von Funktionen, etc machen muss.
Michael Hack

Michael Hack Software :: Softwareentwicklung | Webentwicklung | IT-Dienstleistungen
www.michaelhacksoftware.de :: www.mh-s.de :: www.michael-hack.de
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Inline-If

Beitrag von Sicro »

Ich werde beide Varianten ins CodeArchiv hinzufügen:
  • Inline-If: z_Miscellaneous/Inline-If.pbi
  • If-Set: z_Miscellaneous/If-Set.pbi
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Re: Inline-If

Beitrag von DarkSoul »

Die If-Politik finde ich schon immer in PB etwas misslungen.

Andere Sprache:
if (a > 255) a = 255;
b = (a = 10 ? 5 : c);
In PB fürchterlich sperrig:

Code: Alles auswählen

If a > 255
  a = 255
EndIf
If a = 10
  b = 5
Else 
  b = c 
EndIf
Das Aufreihen von Codezeilen mit : finde ich persönlich auch unschön.

In QBASIC gab es wenigstens noch:

Code: Alles auswählen

IF a > 255 THEN a = 255
Könnte PB ja genauso von Haus aus so machen.

Oder sowas:
b = If a = 0 Then 1 Else 2
Bild
Taz
Beiträge: 27
Registriert: 20.01.2018 18:24
Wohnort: NRW

Re: Inline-If

Beitrag von Taz »

STARGÅTE hat geschrieben:Ist nicht böse gemeint, aber wie ich im englischen Forum schon schrieb, halte ich nichts von diesen Inline-If Sachen (zumindest nicht in diesem selbstgemachten Zustand).
Speziell geht es um die Problematik, dass beide Zustände (True und False) immer ausgeführt werden, was in diesem Fall z.B. zu Problemen führt:
.....
.....
Darum hier meine Bitte, doch bitte lieber auf eine echte Implementierung zu warten, statt "unechte" Tricks zu posten.
Fast 2 Jahre sind nun vergangen... wird es überhaubt eine Implementierung geben? :(
ternary operator, ich vermisse ihn....

Code: Alles auswählen

result = a > b ? x : y
Antworten