0

如果没有,是否会出现类似的情况?

这是我离不开的 JavaScript、Ruby 和 Perl 的一个特性。我知道你可以用哈希成员伪造它,但我希望能够从解析器创建(任意)“第一类”成员。

4

2 回答 2

2

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

于 2012-10-18T21:20:28.970 回答
1

您还可以在类上使用“noSuchMethod”方法来拦截 setter/getter,并将接收到的值存储在 map 中。

例如(我不记得确切的语法......):

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 映射转换为类类型语法的方法。

于 2012-10-19T09:55:18.017 回答