Исправить ветку 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
Это не бросит ошибок во время компиляции, если Вы испортите, но Вы могли бы сделать что-то вроде этого:
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 } );
Это не очень симпатично, но это работает!
Короткий ответ - то, что в 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')
Все еще необходимо жить с тем, что только запаздывающие параметры могут быть опущены, но это - то, как язык сделан (и как его собственные методы определяются и используются).
Существует специальный тип в actionscript 3.0, названном... (покоятся). Поместите этот тип в список параметров для функции и затем что функция может принять любое количество аргументов. Надлежащий sytanx:... arrayName, где arrayName является названием массива, который будет содержать аргументы.
public function forYou( ...args ) : void{ for(var i : int = 0; i
Вы могли реализовать что-то подобное использующее переменное количество аргументов функции, показанной здесь.