【问题标题】:Check if variable exists on class, if so, modify the value of this variable检查类上是否存在变量,如果存在,修改该变量的值
【发布时间】:2016-10-24 20:21:23
【问题描述】:

大家好 StackExchange,这是我的第一篇文章,因为我已经尽力自己解决这个问题,但我找不到与我在 AS3 中的解决方案相匹配的真正好的解决方案。

AS3 代码:

//create player
R.instance({_origin: this, _updatable: 1, _saveToXML: 1, _bodyType: "DYNAMIC", _type: "o_nape_player", _sprite: "idle/CharacterIdle", _x: -32, _y: -512});

//R.instance function exposed + showing how the parameters_ get's passed through
class RInstance {
    public static function create(parameters_:Object = null):Dynamic {
        var instance:XxxxObject = null;
        var _type:String = parameters_._type;

        switch (_type) {
            case "o_nape_player": instance =  new O_nape_player(parameters_);
        }
        parameters_._origin.addToArrayObject( instance );

        return instance;
    }
}

//o_nape_player.as
public function XxxxObject(parameters_:Object = null) {
    parameters = parameters_;
}

protected function set parameters(parameters_:Object):void {
    var parameter:String;
    for (parameter in parameters_) {
        this[parameter] = parameters_[parameter];
    }
    parameters_ = null;
}

所以正如标题所说,在 Haxe 中,我将如何设置类的变量,基于扔给准备解包的类的一袋变量?

我得到的最接近的结果,但这不是我想要的结果,因为它需要 setter 函数:

override public function set_parameters(object:Dynamic):Void {
    for (param in Reflect.fields(object)) {
        try {
            Reflect.callMethod(this, Reflect.field(this, "set" + param.charAt(0).toUpperCase() + param.substr(1)), [Reflect.field(object, param)]);
        } catch (e:Dynamic) {
            //....
        }
    }
}

感谢您的宝贵时间。拜托,我必须强调,正如我刚才所说,这不是我想要的结果,我希望我的 Haxe 代码尽可能与我的 AS3 代码对齐,我的 AS3 代码不需要 setter 函数来设置属于上课。

TL;DR

使用上面发布的所有代码,我可以简单地改写这个问题; 如何在 Haxe 中尽可能简单地复制它: this[参数] = 参数_[参数];

【问题讨论】:

标签: actionscript-3 haxe


【解决方案1】:

事实上,最明显的解决方案是使用Reflect API:

function setAs(other:Test)
{
    for (f in Reflect.fields(other))
        Reflect.setField(this, f, Reflect.field(other, f));
}

一个更完整的例子:Try Haxe #0a6C3

注意事项:

  • 我故意使用了忽略 getter 和 setter 并且只复制原始数据的 API。这可能不是您的用例的最佳选择,如有必要,请检查 Reflect.getPropertyReflect.setProperty
  • Haxe 可以使用类似映射的语法 (foo[field] = bar[field] = val) 访问对象字段,如果您使用 haxe.DynamicAccess 抽象包装它们。它是Reflect API 之上的一个包装器,更加方便,特别是当您处理具有未知结构的对象时(您通常需要多次调用Reflect.hasField)。
  • 就像在您的示例中一样,我没有添加任何运行时类型检查;如果精确输入 setAs 不可行,Std.isStd.instanceType.typeof 将很有用。

【讨论】:

  • 是否可以读取当前类的所有属性以及它扩展的类?在 AS3 中,读取所有属性,包括父属性。在 Haxe 中,使用上面的这种方法,它只获取父类的属性,而不是当前类。
  • 我不确定您所说的“仅父类,而不是当前类”是什么意思。它应该可以工作,正如您在(这个新的)Try Haxe #13Ae0 中看到的那样。也许您没有在其他任何地方明确使用(不使用反射)该字段,它会被Dead Code Elimination (DCE) 删除?查看使用-D dce-debug 构建的输出和/或尝试使用@:keep 元数据,就像我在本示例中使用的那样。
猜你喜欢
  • 2013-11-13
  • 2014-09-08
  • 1970-01-01
  • 2010-10-25
  • 2013-03-05
  • 1970-01-01
  • 2016-12-28
  • 2018-02-17
相关资源
最近更新 更多