在ruby中是否存在instance_variable_set方法的dart中的等价物?

时间:2012-10-18 21:06:01

标签: ruby dart instance-variables dart-mirrors

如果没有,地平线上有这样的东西吗?这是javascript / ruby​​ / perl的一个功能,我无法生存。我知道你可以用散列成员伪造它,但我不能创造(任意)"头等"来自解析器的成员。

2 个答案:

答案 0 :(得分:2)

目前没有什么可以设置一个尚不存在的字段。 mirror API可用于设置已存在的字段,最终可以扩展为支持动态定义新字段。

答案 1 :(得分:1)

你也可以使用" noSuchMethod"类上的方法,用于拦截setter / getter,并将接收到的值存储在映射中。

例如(我无法完全记住语法......):

class Foo {
  var _dynamicProperties = new Map<String,Object>();

  noSuchMethod(String function_name, List args) {
    if (args.length == 0 && function_name.startsWith("get:")) {
      //synthetic getter
      var property = function_name.replaceFirst("get:", "");
      if (_dynamicProperties.containsKey(property)) {
        return _dynamicProperties[property];
      }
    }
    else if (args.length == 1 && function_name.startsWith("set:")) {
      //synthetic setter
      var property = function_name.replaceFirst("set:", "");
      //if the property doesn't exist, it will only be added
      _dynamicProperties[property] = args[0];
      return _dynamicProperties[property];
    }

    super.noSuchMethod(function_name, args)
  }
}

然后您可以在代码中使用它,如下所示:

var foo = new Foo();
foo.bar = "Hello World";
print(foo.bar);

当然,这可能导致类型检查器无法检查的拼写错误,例如:

foo.bar = "Hello";
foo.baz = "Hello World"; // typo, meant to update foo.bar.

通过使用重定向工厂构造函数和隐含接口,有一些方法可以进行类型检查器验证,但随后它开始变得复杂。

旁注:这是JsonObject用于将json映射转换为类类型语法的内容。