0

ActionScript 3では、オプションのブール引数を受け入れる関数を定義するクリーンな方法はありますか?ご存知かもしれませんが、これは無効です:

public function test(param:Boolean = null):void {
    trace(param);
}

これにより、次のエラーがトリガーされます。VerifyError:エラー#1102:ブール型のデフォルト値が無効です。はプリミティブなので、Booleanに設定できないのは理にかなっていると思いますnull。私が見つけた唯一の回避策は、パラメーターをオブジェクトにキャストすることです。

public function test(param:Object = null):void {
    trace(Boolean(param));
}

ただし、特にライブラリを開発している場合、これはあまりクリーンに感じられません。ASDocは、期待されるパラメータがであるのObjectに対し、実際に必要なのはであるというAPIドキュメントを生成しますBoolean

より良いアプローチはありますか?

4

4 に答える 4

2

あなたが言ったように、ブール値を値に設定することはできませんnull

trueしたがって、またはのいずれかであるデフォルト値を指定する必要がありますfalse

public function test(param:Boolean = false):void {
    trace(param);
}

ただし、何も設定されていない3番目のケースが必要なため、1つのオプションは、任意のオブジェクトを受け入れるが、nullでもブール値でもない場合は例外をスローすることです。

    public function test(param:* = null):void
    {
        if (param != null)
        {
            if ((param == true) || (param == false))
            {
                trace(Boolean(param).toString());
            }
            else
            {
                throw new CustomError("param should be a boolean");
            }
        }
        else
        {
            // Do nothing
        }
    }

このソリューションは、、、、などと比較できるオブジェクトまたはプリミティブも受け入れることに注意しtrueてください。false01[]

于 2013-03-22T01:50:17.090 に答える
2

あなたが言うときoptional、私はあなたが提供された値がない場合、あなたがdefault真または偽の値を持っていた場合と比較して何か違うことが起こるはずであることを意味すると思います。

次のようなクラスを使用して、必要な3つの状態を処理し、コードの可読性を維持する独自のオブジェクトを作成できます。

public class Condition
{

    private var _value:* = null;


    public function Condition(initial:* = null)
    {
        value = initial;
    }


    public function set value(n:*):void
    {
        if(_value === null || _value === false || _value === true)
        {
            _value = n;
        }
    }


    public function get value():*{ return _value; }

}

そして、あなたの関数は次のようになります。

function test(param:Condition = null):void
{
    if(param && param.value != null)
    {
        trace(param.value);
    }
}


test( new Condition() );
test( new Condition(true) );
于 2013-03-22T02:12:13.660 に答える
0

Object上記の良い提案と議論から、ライブラリのシナリオでは、簡単にするために、デフォルト値のようにパラメータを入力するのが最善の方法であると思いますが、APIドキュメントでnullaを要求します。Boolean

/**
 * @param param Boolean object or null
 */
public function test(param:Object = null):void {
    trace(Boolean(param));
}

これにより、ライブラリのユーザーはブール値を渡すか、まったく渡すことができなくなります。みんな、ありがとう。

于 2013-04-04T20:09:47.457 に答える
0

私の以前の答えについてはたくさんの議論がありましたが、これは3つの状態のいずれかを受け入れる関数を持つ正しい方法です。私の以前の回答は、あなたが要求していたようにブール値の使用を維持しようとしましたが、それはそれを実行する正しい方法ではありません。

3つの値を定義するクラスを作成します。

class State
{
    public static const EMPTY:int = -1;
    public static const FALSE:int = 0;
    public static const TRUE:int = 1;
}

関数は(クラスint内の3つのプロパティのそれぞれのタイプ)を受け入れます。State3つの可能な値を扱います。State簡潔なコメントを使用して、クラスを参照し、関数が期待している値を開発者に通知できます。デフォルト値は-1別名State.EMPTYです。

/**
 * Function description.
 * @param state One of three states, defined by State.
 */
function test(state:int = -1):void
{
    switch(state)
    {
        case State.EMPTY:
            // No value given.
        break;

        case State.TRUE:
            // True.
            //

        break;

        case State.FALSE:
            // False.
            //

        break;

        default:
            throw new ArgumentError("Unsupported value for test()");
        break;
    }
}
于 2013-04-07T07:51:22.513 に答える