2009-05-08 24 views
11

Tôi muốn thực hiện logic sau:AS3: khai báo một tham số "không xác định" cho int, uint hoặc Số

function setMyValue (myVar:int = undefined):void 
{ 
    if (myVar == undefined) 
    { 
     /* Generate a value for myVar */ 
    } 
    else 
    { 
     /* Use the supplied value for myVar */ 
    } 
} 

Vì vậy, nếu giá trị được cung cấp, sử dụng nó. Nếu không, hãy tạo nó. Có vẻ đơn giản là đủ.

Vấn đề là AS3 không thích điều này. 'undefined' bị ép buộc thành '0', vì vậy myVar chưa bao giờ được xác định. Tôi đã thử các biến thể với NaN, null, vv, nhưng không có gì đã làm việc. Kludge duy nhất mà tôi có thể nghĩ ra là cung cấp một số 'số ma thuật' để sử dụng làm mặc định, nhưng đó là điều xấu. Bất cứ ai biết một giải pháp tốt hơn?

Cảm ơn!

+0

Ah, OK, Số là hơi khác nhau. Số mặc định là NaN, do đó, cá thể đó có thể được xử lý bằng isNaN (myVar). Tuy nhiên, vẫn muốn giải quyết cho int và uint. – Wikiup

Trả lời

14

UPD (từ bình luận của tôi): Chắc chắn không phải là một thực hành tốt để chọn một số con số kỳ diệu để chỉ ra giá trị vắng mặt, trừ khi bạn có thể hoàn toàn chắc chắn con số kỳ diệu này sẽ không xuất hiện như là kết quả của một số arithmetics (nói chung là đúng). Vì vậy, cách tiếp cận tốt nhất ở đây là sử dụng loại rộng hơn int (ví dụ: Number) hoặc chuyển một số cờ (Boolean giá trị) để hoạt động, cũng như int, để cho biết sự vắng mặt giá trị thực tế. Sự lựa chọn nên phụ thuộc vào việc bạn muốn nhấn mạnh tầm quan trọng của thực tế là giá trị truyền là không thể thiếu.


Nếu bạn cảm thấy thoải mái với việc mở rộng loại đối số, sau đó bạn nên sử dụng NaN và làm điều này:

function setMyValue (myVar : Number = NaN) : void 
{ 
    if (isNaN(myVar)) 
    { 
     /* Generate a value for myVar */ 
    } 
    else 
    { 
     /* Use the supplied value for myVar */ 
    } 
} 

Đó là chính xác về mặt kỹ thuật cả hơn và nó cũng ổn định hơn. Nó cũng sẽ cho phép bạn mạnh mẽ gõ vào thời gian biên dịch và sẽ không gây ra lỗi lạ như trong trường hợp sử dụng Object.

Lưu ý rằng thao tác này sẽ không hoạt động với int là một trong các câu trả lời được đề xuất. int chỉ có chỉ giá trị bằng số và NaN sẽ bị ép buộc thành 0. Bạn sẽ cần sử dụng loại Number.

Nếu bạn lo lắng về hiệu suất - đừng. Sử dụng Number thay vì int hoặc uint nói chung là OK.


UPD: Nếu bạn muốn một cách rõ ràng đánh dấu luận rằng nên không thể thiếu chỉ cần sử dụng cờ bổ sung và loại chính xác - nó sẽ được rõ ràng hơn nhiều.

function setMyValue (isIntValueSupplied : Boolean = false, intValue : int = 0) : void 
{ 
    if (isIntValueSupplied) 
    { 
     /* Generate or use a default value of intValue */ 
    } 
    else 
    { 
     /* Use the supplied value for intValue */ 
    } 
} 

lựa chọn khác là để xác định kiểu của riêng bạn với giá trị bổ sung, ví dụ MaybeInt, giữ giá trị số nguyên và cờ (cho dù nó có thực sự được khởi tạo hay không). Bằng cách đó, bạn sẽ báo hiệu rõ ràng rằng giá trị phải là không thể tách rời hoặc không có giá trị. Tuy nhiên, cách tiếp cận này có thể hơi cồng kềnh.

+0

Điều này chắc chắn đang tiến gần hơn, ít nhất tôi sẽ biết rằng đó là một số đến thông qua param (mà sau đó tôi có thể quay lại một int/uint), nhưng nó đi đến cùng một vấn đề như mối quan tâm của tôi với đáp ứng của dirkgently. Nó có thực sự gọn gàng hơn đối với kiểu dữ liệu sai không? Có lẽ tôi chỉ đơn giản là yêu cầu một cái gì đó mà không thể được thực hiện một cách thực sự sạch sẽ. BTW, điều này không có gì để làm với hiệu suất mỗi se. Tôi chỉ đơn giản là cố gắng thiết lập một cách tiếp cận thực hành tốt nhất cho vấn đề này. Cảm ơn đã giúp đỡ! – Wikiup

+0

@Wikiup: Chắc chắn không phải là một cách tốt để chọn một số ma thuật để chỉ ra sự vắng mặt giá trị, trừ khi bạn có thể hoàn toàn chắc chắn số ma thuật này sẽ không xuất hiện như là kết quả của một số arithmetics (mà nói chung là đúng). Vì vậy, cách tiếp cận tốt nhất ở đây là sử dụng loại rộng hơn 'int' (ví dụ:' Số'), hoặc vượt qua một số cờ ('Giá trị Boolean') để hoạt động, cũng như' int', để chỉ ra sự vắng mặt giá trị thực. Sự lựa chọn nên phụ thuộc vào việc bạn muốn nhấn mạnh tầm quan trọng của thực tế là giá trị truyền là không thể thiếu. – dragonfly

+0

Tôi nghĩ nhận xét của bạn cung cấp giải pháp "thực hành tốt nhất" tốt hơn nhiều so với câu trả lời ban đầu của bạn. Tôi đồng ý rằng số lượng ma thuật hiếm khi là một ý tưởng hay (sau cùng thì đó là điểm đăng bài gốc của tôi). function setMyValue (useSuppliedValue: Boolean = false, suppliedValue: int = 0), trong khi wordier, dường như cung cấp một định dạng ít mơ hồ hơn cho phương thức; điều này đánh tôi như một câu trả lời khá chắc chắn. Nếu bạn muốn chỉnh sửa câu trả lời của bạn và viết nó lên như vậy, tôi sẽ vui vẻ kiểm tra 'trả lời' và tín dụng bạn với các điểm đại diện. : c) Rất cám ơn! – Wikiup

2

Giá trị được tạo có phải là const không? Nếu có, tại sao không chỉ đơn giản là có giá trị mặc định này?

Vấn đề là AS3 không thích điều này. 'undefined' bị ép buộc thành '0', vì vậy myVar chưa bao giờ được xác định.

Vâng, bởi vì, đây là giá trị khởi tạo mặc định cho int (ví stringObject this'd được null).

Các tùy chọn khác là để lỏng lẻo gõ tham số như một Object hoặc giữ nó không xác định (bằng cách sử dụng một *) và sau đó định kiểu nó để int nếu nó là phi null.

function setMyValue (myVar:Object = null):void 
{ 
    if (myVar == null) 
    { 
     /* Generate a value for myVar */ 
    } 
    else 
    { 
     int value = myVar as int; 
     /* Use the supplied value for myVar */ 
    } 
} 
+0

Đánh giá cao phản hồi nhanh. Giá trị được tạo không phải là một const; nó cần phải được tạo ra tại thời điểm phương thức được gọi. Tôi đoán câu hỏi của tôi sẽ được đánh máy theo cách này bằng cách sử dụng một số ma thuật? Làm theo cách bạn đề nghị sẽ có nghĩa là tôi cần phải chà dữ liệu để đảm bảo rằng tôi không được giao một giá trị bất hợp pháp (chuỗi/Số/Microphone). Ít nhất bằng cách sử dụng số ma thuật, một nhà phát triển sẽ biết loại dữ liệu cần thiết. Tôi chỉ nghĩ rằng phải có một cách sạch hơn để làm điều này. – Wikiup

+0

BTW, tôi yêu bạn trong "Thời gian trà đen tối ..."; c) – Wikiup

2

giải pháp của tôi là chỉ cần sử dụng này

if(myUint == new uint){ is undefined, act appropriately; } 
+0

Vấn đề là (new uint == 0) giải quyết thành sự thật. Vì vậy, bạn thực sự chỉ cần thử nghiệm nếu myUint == 0. –

0
function setMyValue (myVar:int = -1):void 
{ 
    if (myVar == -1) 
    { 
     /* Generate a value for myVar */ 
    } 
    else 
    { 
     /* Use the supplied value for myVar */ 
    } 
} 
Các vấn đề liên quan