2011-06-13 22 views
0

說法如果我有這樣一個功能:命名動作

 

     public function defaultValues(first = 1,second =2,third = 3) 
     { 
      trace(first); 
      trace(second); 
      trace(third); 
     } 
 

我怎麼能只透過在第二= 20的值調用這個函數?

+0

in c#你可以做defaultValues(second:20);參考:http://msdn.microsoft.com/en-us/library/dd264739.aspx – basarat 2011-06-13 11:09:52

回答

7

ActionScript3不支持命名參數。如果你真的想這個問題,您可以使用關聯數組...但我不建議這樣做,除非你真的想成爲動態:

public function defaultValues(params:Object) 
{ 
    var first = "first" in params ? params.first : 1; 
    var second = "second" in params ? params.second : 2; 
    var third = params.third ? params.third : 3; 

    trace(first); 
    trace(second); 
    trace(third); 
} 

然後,你可以把它叫做:

defaultValues({second: 99}); 
+0

哈哈......好一個:)但魔術字符串打字不是我的東西:) – basarat 2011-06-13 11:14:40

+0

這不是魔術字符串打字...它是鴨子打字。如果你不喜歡使用魔法字符串,你可以問這個參數。看起來我的修改。再次,這假定這些參數的動態輸入。 – 2011-06-13 11:19:33

+1

我的意思是「輸入魔法字符串」:),因爲沒有辦法阻止某人輸入defaultValues({seocnd: 99});,並且錯誤永遠不會被檢查。它的神奇之處在於,如果不查看函數的代碼,消費者將不知道要傳入什麼。 – basarat 2011-06-13 11:22:30

0

您可能希望僅使用一個參數重載該方法,並且重載的方法使用默認值爲第一個和第三個參數的3 param方法。

+0

這將工作。但實際上這是一個語法問題,而不是一個解決方法的問題。語法可能嗎? – basarat 2011-06-13 11:08:43

+1

ActionScript不支持重載方法。 – Constantiner 2011-06-13 11:10:47

+0

@Constantiner true。我剛剛證實。謝謝。 – basarat 2011-06-13 11:33:52

2

你應該叫:

defaultValues(1, 20); 

BTW是極其糟糕做法不使用嚴格類型在ActionScript。也許你有Javascript或ActionScript 2的背景,但它不能成爲藉口。因此,您的方法應該如下所示:

public function defaultValues(first:int = 1,second:int =2,third:int = 3) : void 
    { 
     trace(first); 
     trace(second); 
     trace(third); 
    } 
+0

我有c#背景,並注意到編譯器警告無論如何:)所以沒有內置的語法這樣的c#?參數總是需要位置? – basarat 2011-06-13 11:12:50

+0

是的。你是對的。 AS3不支持命名參數/參數。你可以使用關聯數組......如果你想...但它很醜。 – 2011-06-13 11:14:24

+0

對。您可以傳遞與默認值相同的值,然後傳遞其他值,例如在我提供的代碼中。 – Constantiner 2011-06-13 11:14:53

1

您可能只有該功能的參數類。 雖然這有點矯枉過正,但它會爲您提供嚴格打印的可選參數。但它確實需要更多的編碼。

class DefaultValuesParams { 
    public var first:int = 1; 
    public var second:int = 2; 
    public var third:int = 3; 
} 

var optionalArgs:DefaultValueParams = new DefaultValueParams(); 
optinalArgs.second = 20; 
defaultValues(optionalArgs);