【问题标题】:Toggling Boolean Problem切换布尔问题
【发布时间】:2010-09-11 23:58:08
【问题描述】:

这段代码是用简单的 ActionScript 编写的,但我假设我的这个问题会出现在所有具有布尔数据类型的语言中。

我只是单击舞台,以便我的布尔变量反转其值,而不是跟踪/打印/记录它的新值。但是,它始终跟踪 true,而不是每次鼠标单击时在 true 和 false 之间切换。

我做错了什么?

var myBool:Boolean;

stage.addEventListener(MouseEvent.CLICK, mouseClickHandler);

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

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

【问题讨论】:

    标签: actionscript boolean toggle


    【解决方案1】:

    您将值传递给函数,而不是引用。这意味着您的 changeBoolean 函数中的布尔值是从 myBool 变量复制的,因此当您在函数中更改它时,它并没有真正更改 myBool 变量。基本上有两种解决方案:

    1. 将函数更改为不接受参数并在其中更改 myBool 变量或
    2. 更改函数,使其返回布尔参数,并在调用函数时,将 myBool 值设置为函数的结果

    【讨论】:

    • 啊...有道理。因为我使用了许多布尔变量,所以我将在传递它的值时反转布尔值:changeBoolean(myBool = !myBool);
    • 我发现这很混乱,因为如果我将其他对象(例如显示对象)传递给函数,那么我可以更改它们。这是否意味着原始数据类型仅作为其值传递给函数,而其他非原始数据类型作为自身传递?这是一般规则吗?
    • 是的,值类型是按值传递的,而引用类型是作为引用传递的(您在函数内部对它们进行的所有操作也会在函数外部影响它们)。引用类型一般是类,而值类型一般是系统类型(布尔、整数、字符等)、枚举和结构。
    【解决方案2】:

    在函数changeBoolean 中,您正在更改boolean 的值(顺便说一下,这个名字很糟糕——尽量避免与内置类型发生命名冲突,即使使用不同的大小写)。这在该函数之外没有任何影响。

    您想改为更改 myBool 的值(我会在 .Net 或 Java 中将其称为类字段)。

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

    ...是我会做的(同样,对 ActionScript 的理解很天真)。

    【讨论】:

      猜你喜欢
      • 2012-01-17
      • 2021-09-02
      • 2017-09-27
      • 2021-02-24
      • 2012-07-21
      • 2011-06-03
      • 1970-01-01
      • 1970-01-01
      • 2018-05-16
      相关资源
      最近更新 更多