7

Python の関数は、キーワード = 値の形式のキーワード引数を使用して呼び出すことができます。たとえば、次の関数:

def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
    print "-- This parrot wouldn't", action,
    print "if you put", voltage, "volts through it."
    print "-- Lovely plumage, the", type
    print "-- It's", state, "!"

次のいずれかの方法で呼び出すことができます。

parrot(1000)
    parrot(action = 'VOOOOOM', voltage = 1000000)
    parrot('a thousand', state = 'pushing up the daisies')
    parrot('a million', 'bereft of life', 'jump')

ActionScript 3 にはこの機能がありません。どのようにそれをエミュレートするのが最善でしょうか?

4

4 に答える 4

7

混乱した場合、コンパイル時にエラーはスローされませんが、次のようなことができます。

public function awesomefunction(input:Object):void {
    if (input.foo) trace("got foo");
    if (input.bar) trace("got bar");
}

そして、それを次のように呼び出すと、次のようになります。

awesomefunction( { foo : 23, bar : 99 } );

{}括弧は、インラインオブジェクトを作成します。上記のコードの長く曲がりくねったバージョンは、次のように書くことができます。

var obj:Object = new Object();
obj.foo = 23;
obj.bar = 99;
awesomefunction( obj );

代わりに配列を指定すると、次のようになります。

awesomefunction( [23, 99 ] );

([]は配列btwの省略形です)

インデックスは次のようにアクセスできます。

public function awesomefunction(input:Object):void {
    if (input[0]) trace("got foo");
    if (input[1]) trace("got bar");
}

したがって、すべてをまとめるには、||という事実を使用できます。演算子は、trueだけでなく、最初にtrueと評価されたオブジェクトの値を返します

public function awesomefunction(input:Object):void {
    var foo:int = input.foo || input[0];
    var bar:int = input.bar || input[1];
    if (foo) trace("got foo:", foo);
    if (bar) trace("got bar:", bar);
}

したがって、上記の関数は、これら3つの呼び出しすべてに対して同じ出力を提供します。

awesomefunction( { foo : 23, bar :55 } );
awesomefunction( { bar : 55, foo : 23 } );
awesomefunction( [ 23, 55 ] );

ただし、これでは名前と番号を混在させることはできませんが、次のようにすることができます。

awesomefunction( { foo : 23, 1 : 55 } );

あまりきれいではありませんが、うまくいきます!

于 2009-01-03T23:47:31.620 に答える
4

簡単に言えば、Actionscript では、パラメーターの順序は関数のシグネチャの一部です。その事実を回避するには、余分な作業を行うか、後で噛み付くような悪いコーディング慣行にふける必要があります。探しているものと同様の柔軟性を得るには、2 つの「良い」オプションがあると思います。正式な方法は、関数のパラメーターとして機能するデータ クラスを定義することです。あれは:

public class ComplaintData {
    public var state:String = "a stiff";
    public var action:String = "voom";
    public var type:String = "Norwegian Blue";
    public var voltage:String;

    public function ComplaintData( v:String ) {
        voltage = v;
    }
}

// somewhere else....

function parrot( cd:ComplaintData ) {
    trace "-- This parrot wouldn't " + cd.action;
    // etc.
}

var cd:ComplaintData = new ComplaintData( "a million" );
cd.action = "jump";
parrot( cd );

状況がよりアドホックである場合、形式的ではないアプローチとして、オプションのパラメーターを自由に使用し、呼び出し元が省略したい末尾以外のパラメーターに null を渡すことができるようにします。これにより柔軟性が得られますが、かなりの清潔さが犠牲になります。

function parrot( voltage:String, 
                 state:String=null, 
                 action:String=null, 
                 type:String=null)  {
    if (state==null) { state = 'a stiff'; }
    if (action==null) { action = 'voom'; }
    if (type==null) { type = 'Norwegian Blue'; }
    // ....
}
parrot('1000')
parrot('1000000', null, 'jump')

しかし、これらのオプションがどちらも扱いにくいと思われる場合、それは実際にあるからです。長い目で見れば、順序付けられたパラメーター リストは Actionscript の文法の一部であるという考えを内面化するのが最終的に最善であり、それらを避けようとしない方がよいでしょう。そうすることは、単純さを犠牲にするか(上記のように)、不適切な慣行につながります(他の回答で示唆されているように、パラメータに構造化されていないオブジェクトを使用するなど、型チェックとエラーチェックの多くの利点が犠牲になります)。

文法を使用する最もバランスの取れた方法は、可能な限りオプションのパラメーターを使用することです。

function parrot( voltage:String, 
                 state:String='a stiff', 
                 action:String='voom', 
                 type:String='Norwegian Blue')  {
    // ...
}
parrot('1000');
parrot('1000000', 'pushing up the daisies');
parrot('a million', 'bereft of life', 'jump')

末尾のパラメーターのみを省略できるという事実を受け入れる必要がありますが、それが言語の作成方法 (およびそのネイティブ メソッドの定義と使用方法) です。

于 2009-01-06T04:47:19.377 に答える
1

actionscript 3.0には、 ...(rest)と呼ばれる特別なタイプがあります。このタイプを関数のパラメーターリストに入れると、その関数は任意の数の引数を受け入れることができます。適切なsytanxは次のとおりです。...arrayName、ここで、arrayNameは、引数を保持する配列の名前です。

public function forYou(... args):void {
   for(var i:int = 0; i
于 2009-01-04T01:04:55.647 に答える
0

hereに示す関数に可変数の引数を使用して、同様のものを実装できます。

于 2009-01-03T23:26:02.757 に答える