Краткий ответ: в 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 );
Если ситуация более специальная, менее формальный подход заключается в либеральном использовании необязательных параметров и разрешении вызывающей стороне передавать значение 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')
Вы все еще должны смириться с тем фактом, что только конечные параметры могут быть опущены, но именно так создается язык (и как определяются и используются его нативные методы).