2009-05-08 13 views
11

Aşağıdaki mantığı uygulamak istiyorum:AS3: int, uint veya Number için "undefined" parametresi bildirme

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

Değer sağlandığında, onu kullanın. Değilse, üretin. Yeterince basit görünüyor.

Sorun şu ki AS3 bundan hoşlanmıyor. 'undefined', '0'a zorlanır, bu yüzden myVar hiçbir zaman tanımlanmamıştır. NaN, null, vs ile varyasyonları denedim ama hiçbir şey işe yaramadı. Saptırmayı düşünebildiğim tek klişe, varsayılan olarak kullanmak için bazı 'büyü numaralarını' tedarik etmektir, ama bu çirkin. Daha iyi bir çözüm bilen var mı?

Teşekkürler!

+0

Ah, tamam, Sayı biraz farklıdır kullanmaktı. Sayı varsayılanları NaN'dir, böylece örnek isNaN (myVar) kullanılarak işlenebilir. Yine de int ve uint için çözmek istiyorum. – Wikiup

cevap

14

UPD: Kesinlikle bu sihirli sayı bazı sonucunda görünmez tamamen emin olabilir sürece, değer yokluğunu göstermek için bazı sihirli numarayı almak için iyi bir uygulama değildir aritmetik (genellikle doğru olan). Bu nedenle, buradaki en iyi yaklaşım, int'dan (örneğin, Number) daha geniş bir tür kullanmak ya da gerçek değer yokluğunu belirtmek için bazı bayrak (Boolean değeri) işlevinin yanı sıra int işlevini geçirmektir. Seçim, değeri geçmişin öneminin önemini vurgulamak isteyip istemediğinize bağlı olmalıdır. Eğer argüman türü genişleyen memnunsanız


, o zaman NaN kullanabilir ve bu yapmalıdır: Her iki teknik olarak daha doğru olduğunu

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

ve aynı zamanda daha kararlı. Ayrıca kuvvetle derleme sırasında yazın sağlayacak ve Object kullanarak olduğu gibi garip hatalar neden olmaz. Bu cevaplardan biri anlaşılacağı gibi int ile çalışmaz

Not. int, yalnızca sayısal değerlere sahiptir ve NaN, 0'a zorlanır. Number türünü kullanmanız gerekir.

Performanstan endişe ediyorsanız - olmayın. Number yerine int veya uint kullanılması genellikle sorun yok.


UPD

: İsterseniz bu argüman sadece ek bayrağı ve kesin türü kullanmak ayrılmaz olmalıdır işaretlemek açıkça etmek - bu çok daha net olacaktır.

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 */ 
    } 
} 

Diğer bir seçenek ek değer, örneğin kendi türünü tanımlamaktır MaybeInt, tamsayı değeri ve bir bayrağı (aslında başlatılmış olsun ya da olmasın) tutar. Bu şekilde, bu değerin integral olması gerektiğini veya no-value olduğunu belirtmiş olursunuz. Ancak, bu yaklaşım biraz hantal olabilir.

+0

Bu kesinlikle yaklaşıyor, en azından paramdan geçen bir sayı olduğunu biliyorum. bir int/uint), ama bu aynı soruna dirsekçe yanıt ile ilgili endişemle gider. Yanlış veri türüne göre yazım gerçekten çok temiz mi? Belki de gerçekten temiz bir şekilde yapılamayacak bir şey soruyorum. Btw, bunun kendi başına performans ile ilgisi yoktur. Sadece bu konuda en iyi uygulama yaklaşımını oluşturmaya çalışıyorum. Yardım için teşekkürler! – Wikiup

+0

@Wikiup: Bu sihirli sayının bazı aritmetiklerin (genellikle doğru olan) bir sonucu olarak ortaya çıkmayacağından tamamen emin olmadıkça, değer eksikliğini göstermek için bazı sihirli sayıları almak kesinlikle iyi bir uygulama değildir. Bu nedenle, buradaki en iyi yaklaşım, ya “int” (örn. 'Number')' dan daha geniş bir tür kullanmak ya da gerçek değer yokluğunu belirtmek için bir fonksiyona ('Boolean' değeri) ve işlevine (int ') geçmek. Seçim, değeri geçmişin öneminin önemini vurgulamak isteyip istemediğinize bağlı olmalıdır. – dragonfly

+0

Bence yorumunuz, orijinal cevabınızdan çok daha iyi bir "en iyi uygulama" çözümü sunuyor. Sihirli sayıların nadiren iyi bir fikir olduğu konusunda hemfikirim (orijinal defterimin noktası). işlev setMyValue (useSuppliedValue: Boolean = false, verilenValue: int = 0), daha kötü ise, yöntem için daha az belirsiz bir biçim sağlıyor gibi görünüyor; Bu oldukça katı bir cevap olarak bana çarpıyor. Cevabınızı düzenlemek ve bu şekilde yazmak istiyorsanız, 'cevapla' nı memnuniyetle kontrol edip, puanlama noktaları ile size kredi vereceğim. : c) Çok teşekkürler! – Wikiup

2

oluşturulan değeri const mı? Eğer öyleyse, neden bunu varsayılan değer olarak değil?

Sorun AS3 böyle olmamasıdır. 'undefined', '0'a zorlanır, bu yüzden myVar hiçbir zaman tanımlanmamıştır. Bu int için varsayılan başlatma değer olduğundan

Evet, ( string ve Object için iyiyerin null olun).

Diğer seçenek gevşek bir Object olarak parametreyi yazın veya bunun null olmayan ise int için kalıplaştığı üzerinde sonradan belirtilmemiş (bir * kullanarak) tutmak ve etmektir. (Benim yorumun)

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

Hızlı yanıt için teşekkür ederiz. Oluşturulan değer bir const değil; yöntemin çağrıldığı anda oluşturulmalıdır. Sanırım benim sorum, bu kadar sihirli bir numara kullanmaktan daha temiz bir şekilde yazı yazmaktır. Önerdiğiniz şekilde yapmak, yasadışı bir değer (string/Number/Microphone) verilmediğinden emin olmak için verileri fırçalamak zorunda kalmam anlamına gelir. En azından sihir numarasını kullanarak bir geliştirici gerekli veri türünü bilirdi. Bunu yapmanın daha temiz bir yolu olması gerektiğini düşünürdüm. – Wikiup

+0

BTW, "Long Dark Tea Time ..." da seni sevdim, c) – Wikiup

2

Benim çözüm sadece bu

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

Sorun şu ki (yeni uint == 0) doğru olarak çözüldü. Yani, gerçekten sadece myUint == 0 olup olmadığını test ediyorsunuz. –

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