11

次のロジックを実装したいと思います。

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

したがって、値が指定されている場合は、それを使用してください。そうでない場合は生成します。十分に単純に思えます。

問題は、AS3 がこれを好まないことです。「未定義」は強制的に「0」になるため、myVar が未定義になることはありません。NaN、null などのバリエーションを試しましたが、何も機能しませんでした。私が勝手に思いつく唯一のこじつけは、デフォルトとして使用する「マジックナンバー」を提供することですが、それは醜いです。誰もがより良い解決策を知っていますか?

ありがとう!

4

4 に答える 4

14

UPD(私のコメントから):値の不在を示すためにマジックナンバーを選択することは確かに良い習慣ではありません。ただし、このマジックナンバーがいくつかの算術演算の結果として表示されないことを完全に確信できる場合を除きます(これは一般的に当てはまります)。intしたがって、ここでの最善のアプローチは、 (eg )よりも幅の広い型を使用するか、関数にNumberフラグ(Booleanvalue)を渡してint、実際の値がないことを示すことです。選択は、渡された値が不可欠であるという事実の重要性を強調するかどうかによって異なります。


引数の型を拡張することに慣れている場合は、次を使用して実行する必要がNaNあります。

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

これは、技術的に正確であると同時に、より安定しています。また、コンパイル時に強く入力できるようになり、を使用する場合のように奇妙なバグが発生することはありませんObject

int答えの1つが示唆しているように、これは機能しないことに注意してください。intは数値のみNaNであり、0に強制変換されます。typeを使用する必要がありますNumber

パフォーマンスが心配な場合は、そうしないでください。またはNumberの代わりに使用することは一般的にOKです。intuint


UPD:引数を整数にする必要があることを明示的にマークしたい場合は、追加のフラグと正確な型を使用するだけです。これははるかに明確です。

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

もう1つのオプションは、MaybeInt整数値とフラグ(実際に初期化されたかどうかに関係なく)を保持する追加の値を使用して独自の型を定義することです。そうすれば、値が整数であるか値がないことを明確に示すことができます。ただし、このアプローチは少しかさばる可能性があります。

于 2009-05-08T17:40:40.057 に答える
2

生成された値は const ですか? そうである場合、単にこれをデフォルト値として使用しないのはなぜですか?

問題は、AS3 がこれを好まないことです。「未定義」は強制的に「0」になるため、myVar が未定義になることはありません。

はい、これはint( forstringおよびObjectthis'd be null) のデフォルトの初期化値であるためです。

もう 1 つのオプションは、パラメーターを として大まかに型指定するObjectか、( a を使用して) 未指定のままに*し、後でint それが non- の場合は型キャストすることですnull

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 */
    }
}
于 2009-05-08T15:45:55.093 に答える
2

私の解決策は、単にこれを使用することでした

if(myUint == new uint){ is undefined, act appropriately; }
于 2010-08-20T11:00:19.500 に答える
0
function setMyValue (myVar:int = -1):void
{
    if (myVar == -1)
    {
        /* Generate a value for myVar */
    }
    else
    {
        /* Use the supplied value for myVar */
    }
}
于 2010-11-17T10:06:03.067 に答える