2010-10-04 52 views
5

Hãy nói rằng tôi có lớp học này:Flex Làm thế nào để gọi một chức năng với một số biến số tham số?

package{ 
    import flash.display.Sprite; 
    public class Main extends Sprite{ 
    public function Main(){ 
     trace(getAverage(1,2,3)); 
     trace(getAverage(1,2,3,4)); 
     trace(getAverage(1,2,3,4,5)); 
    } 
    public function getAverage (...numbers) { 
     var total = 0; 
     for (var i = 0; i < numbers.length; i++) { 
     total += numbers [i]; 
     } 
     return total/numbers.length; 
    } 
    } 
} 

Làm thế nào để hoàn thành "ngược" này? Cụ thể, làm cách nào tôi có thể CALL 'getAverage' với một số động lực của những người thay thế?

Ví dụ, nếu tôi muốn làm một cái gì đó NHƯ:

var r:int=Math.random()*6; 
var a:Array=new Array(); 
for (i:int=0;i<r;i++) { 
    a[i]=Math.random()*22; 
} 
// Now I have 'r' Number Of Parameters Stored In 'a' 
// How Do I Call getAverage, with all the values in 'a'?? 
// getAverage(a) isn't right, is it? 
// I'm looking for something similar to getAverage(a[0],a[1],a[...]); 

var av:Number=getAverage(???); 

Những gì tôi muốn biết là nếu tôi có một chức năng mà phải mất một số biến của tham số, đó là tuyệt vời, nhưng làm thế nào có thể TÔI GỌI CNTT với một số lượng đối số thay đổi, khi số đó không được biết trong thời gian chạy? Có thể nó là không thể ... Tôi chỉ không chắc chắn, vì 'callLater' dường như có thể lấy một mảng và tạo ra một số động các thông số từ nó bằng cách nào đó ...

LƯU Ý: Câu trả lời chỉ bao gồm "Tại sao bạn muốn làm điều này?", Sẽ được giảm giá.

P.S. Điều này KHÔNG phải về tính trung bình! I REALIZE Có cách đơn giản để làm tất cả điều này! (Tôi chỉ có thể viết getAverage để chấp nhận một mảng duy nhất làm tham số duy nhất của nó) Phía trên chỉ là một VÍ DỤ để minh họa cho câu hỏi của tôi. LÀM THẾ NÀO ĐỂ PASS SỐ SỐ ĐỘNG VẬT CỦA PARAMETERS TO MỘT CHỨC NĂNG?

+0

Thay đổi hàm để chấp nhận một mảng thay thế? – Cameron

+0

Điều đó giúp tôi vượt qua một số tham số động như thế nào? Điều đó đòi hỏi phải thay đổi nguyên mẫu của hàm getAverage, nó sẽ đánh bại toàn bộ mục đích của câu hỏi của tôi. Tôi nhận ra tôi chỉ có thể vượt qua một mảng. Lần sau đọc câu hỏi xin vui lòng trước khi bình luận. – Joshua

+0

Ví dụ đầu tiên của bạn dường như trả lời những gì bạn muốn khi bạn chuyển một số tham số động vào một hàm.Đó là exacly những gì còn lại paramter là cho. http://www.sephiroth.it/weblog/archives/2006/06/actionscript_3_rest_parameter.php – Allan

Trả lời

9

Đây có phải là những gì bạn đang tìm kiếm không?

var av:Number = getAverage.apply(null, a); 
0

Vấn đề với câu hỏi của bạn là đối tượng đối số đã là một mảng và sử dụng (... args) đã cung cấp cho bạn một cách năng động để chuyển bất kỳ số đối số nào bạn yêu cầu. Xin lỗi về câu trả lời trước, không suy nghĩ thẳng ...

0

Bạn có thể tạo mảng hoặc đối tượng với các tham số đó và chuyển đối tượng đó cho hàm đó. Đó là điều bình thường.

0

Flash có khả năng nội tâm khá mạnh. Vì vậy, thay vì đi qua một số đối tượng, bạn chỉ cần vượt qua một đối tượng năng động duy nhất với bất kỳ số lượng các thuộc tính bạn cần:

var ob:Object={arg1:"value1", arg2:8}; 
var arg:String="arg4"; 
ob["arg3"]=8; 
ob[arg]=18; 
trace (ob.hasOwnProperty("arg1")); 
trace (ob.arg3); 
trace (ob.arg4); 

đó phải bao trùm chỉ là về bất kỳ trường hợp sử dụng bạn có thể cần. Nhược điểm là điều này cho phép một số khá thông minh và khó khăn để theo dõi lỗi. :-)

3

Dave là chính xác. Bạn có thể sử dụng phương thức áp dụng của một hàm để truyền vào một mảng các đối số.

Dưới đây là một lời giải thích tốt hơn về cách thức hoạt động và những gì các đối số của áp dụng là: http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/Function.html

Cũng lưu ý rằng bạn có thể sử dụng phương pháp gọi để làm điều tương tự nhưng sử dụng ... args (dấu phẩy- danh sách phân tách) thay vào đó, nhưng áp dụng sẽ phù hợp hơn với tình huống của bạn.

Các vấn đề liên quan