2010-09-11 89 views
2

這段代碼是用簡單的ActionScript編寫的,但我假設我的這個問題會發生在所有具有布爾數據類型的語言中。切換布爾問題

我只是簡單地點擊舞臺,以便我的布爾變量反轉其值,並跟蹤/打印/記錄它的新值。然而,它總是追蹤真實,而不是在每次點擊鼠標時切換真與假。

我在做什麼錯?

var myBool:Boolean; 

stage.addEventListener(MouseEvent.CLICK, mouseClickHandler); 

function mouseClickHandler(evt:MouseEvent):void 
    { 
    changeBoolean(myBool); 
    } 

function changeBoolean(boolean:Boolean):void 
    { 
    boolean = !boolean; 
    trace(boolean); 
    } 

回答

5

您正在向函數傳遞值,而不是參考值。這意味着changeBoolean函數中的布爾值是從myBool變量中複製的,所以當您在函數內部更改它時,它並沒有真正改變myBool變量。基本上有兩個解決辦法:

  1. 變化的功能,使其返回boolean參數不接受參數和裏面更改myBool變量或
  2. 變化的功能和調用功能,設置myBool價值的功能的結果
+0

啊......是有道理的。因爲我使用了許多布爾變量,我只是在我傳遞它的值時將布爾值顛倒過來:changeBoolean(myBool =!myBool); – TheDarkIn1978 2010-09-12 00:53:59

+0

我發現這令人困惑,因爲如果我將其他對象(如顯示對象)傳遞給函數,那麼我可以更改它們。這是否意味着原始數據類型僅作爲它們的值傳遞給函數,而其他非原始數據類型是作爲它們自己傳遞的?這是一般規律嗎? – TheDarkIn1978 2010-09-13 03:28:56

+1

是的,值類型是通過值傳遞的,而引用類型是作爲引用傳遞的(並且在函數內部對它們做的所有操作都會影響它們在函數之外)。引用類型通常是類,而值類型通常是系統類型(布爾型,整型,字符型等),枚舉和結構。 – 2010-09-13 07:45:51

4

在功能changeBoolean,你改變了boolean的值(可憐的名字,順便說一句 - 儘量避免與內建類型,即使有不同的外殼命名衝突)參數。這對該功能沒有影響。

您想改變myBool(我將在.Net或Java中調用一個類字段)的值。

function mouseClickHandler(evt:MouseEvent):void 
    { 
    myBool = !myBool; 
    trace(myBool); 
    } 

...是我會做的(同樣,對ActionScript的天真理解)。