如果没有,是否会出现类似的情况?
这是我离不开的 JavaScript、Ruby 和 Perl 的一个特性。我知道你可以用哈希成员伪造它,但我希望能够从解析器创建(任意)“第一类”成员。
如果没有,是否会出现类似的情况?
这是我离不开的 JavaScript、Ruby 和 Perl 的一个特性。我知道你可以用哈希成员伪造它,但我希望能够从解析器创建(任意)“第一类”成员。
目前没有什么可以设置尚不存在的字段。镜像 API可用于设置已存在的字段,并最终可能扩展为支持动态定义新字段。
您还可以在类上使用“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 映射转换为类类型语法的方法。