可以使用关键字= value的关键字参数调用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没有此功能。我怎样才能最好地模仿它?
答案 0 :(得分: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");
}
所以要把它全部带到你可以使用||的事实operator返回首先计算为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);
}
因此,上述函数将为所有这三个调用提供相同的输出:
awesomefunction( { foo : 23, bar :55 } );
awesomefunction( { bar : 55, foo : 23 } );
awesomefunction( [ 23, 55 ] );
但是这不允许你混合命名和编号,但你可以这样做:
awesomefunction( { foo : 23, 1 : 55 } );
它不是很漂亮,但它有效!
答案 1 :(得分:4)
简短的回答是,在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')
你仍然需要考虑这样一个事实,即只能省略尾随参数,但这就是语言的制作方式(以及如何定义和使用它的原生方法)。
答案 2 :(得分:1)
actionscript 3.0中有一个名为 ...(rest)的特殊类型。将此类型放在函数的参数列表中,然后该函数可以接受任意数量的参数。正确的sytanx是: ... arrayName ,其中 arrayName 是将保存参数的数组的名称。
public function forYou( ...args ) : void{ for(var i : int = 0; i
答案 3 :(得分:0)
您可以使用可变数量的参数为显示here的函数实现类似的功能。