AS3中的结构便宜吗?

时间:2018-08-07 22:25:08

标签: actionscript-3

通常,低级语言支持struct,这正是我想在AS3中强力定义的内容。我们可以在C#上执行此操作,但是为什么这样做呢?因为3d位置非常普遍,并且为每个3d位置创建一个对象很无聊,只是因为您不能自由地用其他语言获得不可变的结构,除非您不想自己声明一堆本地人。

Repl.it

struct Vec3f {
    public double x;
    public double y;
    public double z;
}

class Test {
    static void Main() {
        Vec3f cam1 = new Vec3f();
        Vec3f cam2 = cam1;
        cam1.x = 10;
        System.Console.WriteLine(cam1.x == cam2.x); // false
    }
}

如您所见,Vec3f是不可变的值类型。但是在JS,Lua,AS3或其他我们通常不能拥有的这类不可变结构中。是的,我们使用的对象始终是垃圾收集的AFAIK。

在AS3中,我希望能够将一个类元标记为 * immutable * ,但是我不知道该如何在任何地方都不被支持。没有现有的ABC级工具,怎么办?

[Immut] // or [Immutable]
class Vec3f {
    var x: Number
    var y: Number
    var z: Number
}

var a: Location = new Location
var b: Location = a
a.x = 10
a.y === b.x // `true`, but should be *********`false`*********
            // for `Vec3f`.

1 个答案:

答案 0 :(得分:0)

(1)

  

通常,底层语言支持结构,这正是我想在 AS3 中随意定义的内容。
我们可以在 C# ...

上执行此操作

关于您的AS3与C#结果...

// C#   :   System.Console.WriteLine(cam1.x == cam2.x); // gives false.
// AS3  :   trace(a.y === b.x); // gives "true", but should be ******** "false".

AS3结果是因为您先前使用了:var b: Location = a,它实际上使b == a有效。因此,现在a发生变化时,b也会发生变化。

解决方案

要创建结构的hack-ish版本,您只需使用类。要使每个类都唯一,只需使用 new 关键字。

import Vec3f; //import the class (if external AS file)

//# then use "new" keyword to make variables as unique instance of class
var cam1 :Vec3f = new Vec3f();
var cam2 :Vec3f = new Vec3f();

//# check start values (where... vec3f.x == 5 )
trace(" 01 :: cam1.x == " + (cam1.x) ); //gives 5
trace(" 01 :: cam2.x == " + (cam2.x) ); //gives 5

//# update values
cam1.x = 10;
trace("cam1.x == cam2.x ??? result : " + (cam1.x == cam2.x) ); //gives false

//# value checks v2 (results after update)
trace(" 02 :: cam1.x == " + (cam1.x) ); //gives 10
trace(" 02 :: cam2.x == " + (cam2.x) ); //gives 5

即使Java没有struct对象,所以typical solution (example)也是“只使用类”

在AS3中,其他人已经通过创建自己的 point3D 实现(例如在this example中解决了此问题。

(2)

  

但是为什么要这样做(使用struct)?因为3D位置非常普遍,所以为每个3D位置创建一个对象很无聊。

也许可以研究Vector3D API。设置很容易(w是一个可选值,例如:角度或速度)。

var some_vec3f = new Vector3D(x:Number = 0., y:Number = 0., z:Number = 0., w:Number = 0.);

又读:

希望这可能足以帮助您获得3D点的数据容器。