2009-05-08 8 views
11

Ich mag die folgende Logik implementieren:AS3: ein „undefiniert“ Parameter für int, uint oder Zahl erklärt

function setMyValue (myVar:int = undefined):void 
{ 
    if (myVar == undefined) 
    { 
     /* Generate a value for myVar */ 
    } 
    else 
    { 
     /* Use the supplied value for myVar */ 
    } 
} 

Also, wenn der Wert geliefert wird, es zu benutzen. Wenn nicht, erzeuge es. Scheint einfach genug.

Problem ist, dass AS3 dies nicht mag. 'undefined' wird in '0' umgewandelt, so dass myVar niemals undefiniert ist. Ich habe Variationen mit NaN, Null usw. versucht, aber nichts hat funktioniert. Der einzige Klud, den ich mir vorstellen kann, ist, eine 'magische Zahl' als Standard zu liefern, aber das ist hässlich. Wer kennt eine bessere Lösung?

Danke!

+0

Ah verwenden, OK, Zahl ist etwas anders. Number ist standardmäßig NaN, sodass diese Instanz mit isNaN (myVar) behandelt werden kann. Ich will immer noch nach int und uint auflösen. – Wikiup

Antwort

14

UPD (aus meinem Kommentar): Es ist sicherlich keine gute Praxis einige magische Zahl zu holen Wert Abwesenheit anzuzeigen, wenn Sie diese magische Zahl völlig sicher sein kann, nicht als Folge von einigen erscheinen würde Arithmetik (was im Allgemeinen wahr ist). Daher ist der beste Ansatz hier, entweder einen breiteren Typ als int (z. B. Number) zu verwenden oder ein Flag (Boolean-Wert) zu übergeben, um zu funktionieren, sowie int, um den tatsächlichen Wertabwesend anzuzeigen. Wahl sollte davon abhängen, ob Sie die Wichtigkeit der Tatsache betonen möchten, dass der übergebene Wert integral ist.


Wenn Sie mit Erweiterung Argument Typ wohl fühlen, dann sollten Sie NaN verwenden und dies tun:

function setMyValue (myVar : Number = NaN) : void 
{ 
    if (isNaN(myVar)) 
    { 
     /* Generate a value for myVar */ 
    } 
    else 
    { 
     /* Use the supplied value for myVar */ 
    } 
} 

, dass beide mehr ist technisch korrekt, und es ist auch stabiler. Es erlaubt Ihnen auch, bei der Kompilierung stark zu tippen und würde keine merkwürdigen Fehler verursachen, wie im Fall der Verwendung von Object.

Beachten Sie, dass dies mit int nicht funktioniert, wie eine der Antworten suggeriert. int hat nur numerische Werte, und NaN wird auf 0 gezwungen. Sie müssen Number Typ verwenden.

Wenn Sie über Leistung besorgt sind - nicht sein. Die Verwendung von Number anstelle von int oder uint ist im Allgemeinen in Ordnung.


UPD: Wenn Sie möchten, zu markieren ausdrücklich, dass Argument nur zusätzliches Flag und dem genauen Typ verwenden integriert sein sollte - es ist viel klarer sein würde.

function setMyValue (isIntValueSupplied : Boolean = false, intValue : int = 0) : void 
{ 
    if (isIntValueSupplied) 
    { 
     /* Generate or use a default value of intValue */ 
    } 
    else 
    { 
     /* Use the supplied value for intValue */ 
    } 
} 

Eine weitere Option ist Ihre eigene Art mit zusätzlichem Wert zu definieren, z.B. MaybeInt, die einen ganzzahligen Wert und ein Flag enthält (ob es tatsächlich initialisiert wurde oder nicht). Auf diese Weise würden Sie deutlich signalisieren, dass der Wert integral oder kein Wert sein sollte. Dieser Ansatz kann jedoch etwas sperrig sein.

+0

Das kommt mir sicher näher, da ich zumindest weiß, dass es eine Nummer ist, die durch den Param kommt (auf die ich dann umstellen kann) ein int/uint), aber es geht um das selbe Problem wie meine Besorgnis über die Reaktion von Dirkently. Ist es wirklich sauberer, auf den falschen Datentyp zu tippen? Vielleicht frage ich einfach nach etwas, was nicht wirklich sauber gemacht werden kann. Übrigens, das hat nichts mit Leistung an sich zu tun. Ich versuche einfach, einen Best-Practice-Ansatz für dieses Problem zu entwickeln. Danke für die Hilfe! – Wikiup

+0

@Wikiup: Es ist sicherlich keine gute Methode, eine magische Zahl zu wählen, um Wertlosigkeit anzuzeigen, es sei denn, Sie können absolut sicher sein, dass diese magische Zahl nicht als Ergebnis einiger Berechnungen erscheint (was im Allgemeinen der Fall ist). Daher ist der beste Ansatz, entweder einen breiteren Typ als "int" (z. B. "Number") zu verwenden oder ein Flag ('Boolean'-Wert) zu übergeben, sowie' int', um den tatsächlichen Wertabwesend anzuzeigen. Wahl sollte davon abhängen, ob Sie die Wichtigkeit der Tatsache betonen möchten, dass der übergebene Wert integral ist. – dragonfly

+0

Ich denke, Ihr Kommentar bietet eine weitaus bessere "Best Practice" -Lösung als Ihre ursprüngliche Antwort. Ich stimme zu, dass magische Zahlen selten eine gute Idee sind (das war schließlich der Punkt meiner ursprünglichen Veröffentlichung). function setMyValue (useSuppliedValue: Boolean = false, mitgelieferterWert: int = 0), während wordier ein weniger zweideutiges Format für die Methode zu liefern scheint; Das erscheint mir als eine ziemlich solide Antwort. Wenn Sie Ihre Antwort bearbeiten und als solche aufschreiben möchten, überprüfe ich gerne die Antwort und belohne Sie mit den Rep-Punkten. : c) Vielen Dank! – Wikiup

2

Ist der generierte Wert ein const? Wenn ja, warum nicht einfach als Standardwert verwenden?

Problem ist, dass AS3 dies nicht mag. 'undefined' wird in '0' umgewandelt, so dass myVar niemals undefiniert ist.

Ja, da dies der Standard Initialisierungswert für int ist (für string und Object this'd null sein).

Die andere Option ist es lose um den Parameter als Object oder zu halten, nicht spezifiziert den Typ (durch einen * verwenden) und später Typumwandlung es int wenn es nicht null ist.

function setMyValue (myVar:Object = null):void 
{ 
    if (myVar == null) 
    { 
     /* Generate a value for myVar */ 
    } 
    else 
    { 
     int value = myVar as int; 
     /* Use the supplied value for myVar */ 
    } 
} 
+0

Schätzen Sie die schnelle Antwort. Der generierte Wert ist kein const; Es muss zum Zeitpunkt des Aufrufs der Methode generiert werden. Ich denke, meine Frage wäre, dass ich auf diese Weise sauberer tippen würde als mit einer magischen Zahl? Wenn Sie es so machen, wie Sie es vorschlagen, würde das bedeuten, dass ich die Daten putzen muss, um sicherzustellen, dass mir kein illegaler Wert (String/Number/Microphone) übergeben wird. Zumindest unter Verwendung der magischen Zahl würde ein Entwickler den erforderlichen Datentyp kennen. Ich würde einfach denken, dass es einen saubereren Weg geben muss, dies zu tun. – Wikiup

+0

BTW, ich liebte dich in "Long Dark Tea Time ..."; c) – Wikiup

2

Meine Lösung war einfach diese

if(myUint == new uint){ is undefined, act appropriately; } 
+0

Das Problem ist, dass (neu uint == 0) in wahr aufgelöst wird. Sie testen also nur, ob myUint == 0 ist. –

0
function setMyValue (myVar:int = -1):void 
{ 
    if (myVar == -1) 
    { 
     /* Generate a value for myVar */ 
    } 
    else 
    { 
     /* Use the supplied value for myVar */ 
    } 
} 
Verwandte Themen