Как эмулировать аргументы ключевого слова в функциях ActionScript 3

Исправить ветку red (история не изменится): Один из способов - вернуть revert-commit-1 & amp; revert-commit-2 затем объединить ветку blue с веткой red.

$ git checkout red   # checkout to 'red' branch
$ git log            # copy the 'revert-commit-2' & 'revert-commit-1' commit hash

$ git revert <revert-commit-2-hash>
$ git revert <revert-commit-1-hash>

$ git pull origin blue              # merge the blue branch changes

Другой способ: Заменить текущую ветвь red веткой purple (история ветвей red будет изменена)

# first backup the 'red' branch for just safety
$ git checkout red
$ git branch red.bac

# replace red branch with purple branch
$ git checkout purple
$ git branch -D red    # delete 'red' branch
$ git checkout -b red  # create & checkout to new local 'red' branch with 'purple' branch history

# now if you pushed the 'red' branch already then you need to do force (-f) push otherwise do normal push
$ git push -f origin red
7
задан 3 January 2009 в 23:03
поделиться

4 ответа

Это не бросит ошибок во время компиляции, если Вы испортите, но Вы могли бы сделать что-то вроде этого:

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");
}

Таким образом, чтобы принести всему этому toghether можно использовать то, что || оператор возвращает значение объекта, который сначала оценивает к истинному, не просто верному, чтобы сделать:

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);
}

Так, вышеупомянутая функция даст тот же вывод для всех этих трех вызовов:

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

Это однако не позволит Вам смешиваться названный и пронумерованный, но можно сделать как это:

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

Это не очень симпатично, но это работает!

7
ответ дан 6 December 2019 в 21:21
поделиться

Короткий ответ - то, что в Actionscript, порядок параметров является частью подписи функции. Для обхождения того факта или необходимо сделать дополнительную работу или баловаться плохим кодированием методов, которые укусят Вас позже. Я сказал бы, что у Вас есть две "хороших" опции для получения гибкости, подобной тому, что Вы ищете. Формальный путь состоял бы в том, чтобы определить класс данных для действия как параметр функции. Это:

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 );

Если ситуация является более специальной, менее формальный подход должен сделать свободное использование дополнительных параметров и позволить вызывающей стороне передавать пустой указатель для любого не запаздывающего параметра, который они хотят опустить. Это получает Вас гибкость, но Вы жертвуете честной сделкой чистоты:

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')

Все еще необходимо жить с тем, что только запаздывающие параметры могут быть опущены, но это - то, как язык сделан (и как его собственные методы определяются и используются).

4
ответ дан 6 December 2019 в 21:21
поделиться

Существует специальный тип в actionscript 3.0, названном... (покоятся). Поместите этот тип в список параметров для функции и затем что функция может принять любое количество аргументов. Надлежащий sytanx:... arrayName, где arrayName является названием массива, который будет содержать аргументы.

public function forYou( ...args ) : void{
   for(var i : int = 0; i 
1
ответ дан 6 December 2019 в 21:21
поделиться

Вы могли реализовать что-то подобное использующее переменное количество аргументов функции, показанной здесь.

0
ответ дан 6 December 2019 в 21:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: