2008-09-08 20 views
13

Actionscript 3.0 (và tôi giả sử Javascript và ECMAScript nói chung) thiếu thông tin tham chiếu cho các kiểu gốc như int. Kết quả là tôi nhận được giá trị trở lại từ một hàm thực sự clunky. Mô hình bình thường để giải quyết vấn đề này là gì?Cách sạch nhất để mô phỏng tính năng tham chiếu qua đường trong Actionscript 3.0 là gì?

Ví dụ: có cách nào để thực hiện hoán đổi (intA, intB) trong Actionscript?

Trả lời

7

I Believe là tốt nhất bạn có thể làm là vượt qua một đối tượng container như một tham số để một hàm và thay đổi các giá trị của một số thuộc tính trong đối tượng đó:

function swapAB(aValuesContainer:Object):void 
{ 
    if (!(aValuesContainer.hasOwnProperty("a") && aValuesContainer.hasOwnProperty("b"))) 
     throw new ArgumentError("aValuesContainer must have properties a and b"); 

    var tempValue:int = aValuesContainer["a"]; 
    aValuesContainer["a"] = aValuesContainer["b"]; 
    aValuesContainer["b"] = tempValue; 
} 
var ints:Object = {a:13, b:25}; 
swapAB(ints); 
+1

hasseg, tôi đang hy vọng ai đó biết mẹo lừa đảo hơn, nhưng có vẻ như câu trả lời của bạn là tốt nhất. Tôi đoán việc theo dõi tự nhiên là: Giới hạn này có khiến bất kỳ ai khác phát điên, hay chỉ là tôi? :) –

+0

nó khiến tôi hơi điên mỗi lúc rồi. Tôi không nghĩ rằng tất cả các bạn quá đơn độc trên cái đó. –

-2

Nếu ActionScript hoạt động giống như Javascript,

[a,b] = [b,a] 
+0

Xin lỗi, nhưng điều đó không hoạt động trong ActionScript – Turambar

4

tôi cho rằng một sự thay thế sẽ là ở đâu đó xác định các loại điều này ...

public class Reference { 
    public var value:*; 
} 

Sau đó, sử dụng các hàm tham số tham số để hoạt động như "con trỏ" nếu bạn thực sự chỉ tìm kiếm tham số "out" và khởi tạo chúng trên đường đi hoặc không và swap của bạn sẽ trở thành:

function swap(Reference a, Reference b) { 
    var tmp:* = a.value; 
    a.value = b.value; 
    b.value = tmp; 
} 

và bạn luôn có thể đi các loại hạt và xác định IntReference cụ thể, StringReference vv

3

bạn cũng có thể sử dụng một wrapper thay vì int:

public class Integer 
{ 
    public var value:int; 

    public function Integer(value:int) 
    { 
     this.value = value; 
    } 
} 

Tất nhiên, điều này sẽ hữu ích hơn nếu bạn có thể sử dụng vận hành quá tải ...

4

này được săm soi, nhưng int, String, Number và những người khác được thông qua tham khảo, nó chỉ là họ là không thay đổi. Tất nhiên, hiệu ứng cũng giống như nếu chúng được truyền theo giá trị.

1

Thật khó chịu. Nhưng nếu bạn sử dụng các thành ngữ khác nhau, ví dụ: C#, bạn có thể nhận được kết quả chất lượng hợp lý. Nếu bạn cần truyền nhiều tham số qua lại, hãy truyền vào một đối tượng chứa đầy dữ liệu cần thiết và thay đổi các tham số của đối tượng khi bạn quay trở lại. Lớp Object chỉ dành cho thứ này.

Nếu bạn chỉ cần trả lại một loạt dữ liệu, hãy trả về một đối tượng. Điều này phù hợp hơn với phong cách ECMAScript so với ngữ nghĩa truyền qua.

0

Chuyển nhượng cấu trúc (ví dụ: [a, b] = [b, a]) không được xác định trong đặc tả ECMA-262 3 và không được triển khai trong JavaScript 1.5, phiên bản tương đương với việc triển khai JScript trong I E. Tôi đã nhìn thấy cú pháp này trong bản xem trước thông số kỹ thuật AS4, và tôi tin rằng đó là một phần của JavaScript 1.7.

2

Chỉ cần nhìn vào một số mã Java. Java đã có quy ước rằng các kiểu tham chiếu được truyền bởi các kiểu tham chiếu và nguyên thủy được truyền theo giá trị kể từ khi nó khởi đầu. Đó là một mô hình rất tốt theo nhiều cách.

Nhưng nói về hoán đổi, cách tốt nhất và dễ nhất để làm một trao đổi trong Java/AS3 là với ba dòng sau:

 
var temp:int = array[i]; 
array[j] = array[i]; 
array[i] = temp; 

Theres không thực sự bất kỳ lý do gì để sử dụng một chức năng để làm một trao đổi đơn giản , khi bạn có thể làm nhanh hơn chỉ với 3 dòng.

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