检查类上是否存在变量,如果是,则修改此变量的值

时间:2016-10-24 20:21:24

标签: actionscript-3 haxe

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中尽可能简单地复制它: 这[参数] = parameters_ [参数];

1 个答案:

答案 0 :(得分:3)

最明显的解决方案实际上是使用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
  • 如果使用foo[field] = bar[field] = val摘要包装它们,Haxe可以使用类似地图的语法(haxe.DynamicAccess)访问对象字段。它是Reflect API之上的包装器,它更方便,特别适用于处理结构未知的对象(通常需要调用{{1很多次)。
  • 就像你的例子中一样,我没有添加任何运行时类型检查;如果输入Reflect.hasField并不可行,Std.isStd.instanceType.typeof会很有用。