以下是在Dart平台中使用此eval方法代码。
这是通过反射完成的。
_getFieldSlow(unwrapped) {
// ..... Skipped
var atPosition = unwrapped.indexOf('@');
if (atPosition == -1) {
// Public symbol.
f = _eval('(x) => x.$unwrapped', null);
} else {
// Private symbol.
var withoutKey = unwrapped.substring(0, atPosition);
var privateKey = unwrapped.substring(atPosition);
f = _eval('(x) => x.$withoutKey', privateKey);
}
// ..... Skipped
} static _eval(expression, privateKey)
native "Mirrors_evalInLibraryWithPrivateKey";DEFINE_NATIVE_ENTRY(Mirrors_evalInLibraryWithPrivateKey, 2) {
GET_NON_NULL_NATIVE_ARGUMENT(String, expression, arguments->NativeArgAt(0));
GET_NATIVE_ARGUMENT(String, private_key, arguments->NativeArgAt(1));
const GrowableObjectArray& libraries =
GrowableObjectArray::Handle(isolate->object_store()->libraries());
const int num_libraries = libraries.Length();
Library& each_library = Library::Handle();
Library& ctxt_library = Library::Handle();
String& library_key = String::Handle();
if (library_key.IsNull()) {
ctxt_library = Library::CoreLibrary();
} else {
for (int i = 0; i < num_libraries; i++) {
each_library ^= libraries.At(i);
library_key = each_library.private_key();
if (library_key.Equals(private_key)) {
ctxt_library = each_library.raw();
break;
}
}
}
ASSERT(!ctxt_library.IsNull());
return ctxt_library.Evaluate(expression);runtime/vm/bootstrap_natives.h
V(Mirrors_evalInLibraryWithPrivateKey, 2) \附注:
我在这里提问是因为我不能在Dart邮件列表中提问。
附注:
正如我们在mirrors_impl.dart中看到的static private method
static _eval(expression, privateKey) native "Mirrors_evalInLibraryWithPrivateKey";有没有人希望这个方法是公开的?(this is not a question but just a thought aloud)。
发布于 2014-02-07 23:53:33
根据Dart FAQ的说法,像这样的纯字符串eval不太可能进入语言,即使可能会添加其他动态功能:
例如,Dart不太可能支持将字符串作为当前上下文中的代码进行计算,但它可能支持将该代码动态加载到新的
中。Dart不太可能支持向值添加字段,但它可能(通过镜像系统)支持向类添加字段,并且您可以使用noSuchMethod()有效地添加方法。使用这些功能会有运行时成本;对我们来说,最大限度地减少不使用它们的程序的成本是很重要的。
这一领域仍在开发中,因此我们欢迎您对运行时dynamism有何需求的想法。
https://stackoverflow.com/questions/21631974
复制相似问题