這是在Dart平臺中使用此方法eval
的代碼。Dart VM本身在`dart:mirrors`中實現`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郵件列表中提問。
P.S.
正如我們可以看到它在mirrors_impl.dart
static private method
:
static _eval(expression, privateKey) native "Mirrors_evalInLibraryWithPrivateKey";
有誰想,這種方法應該是公開的? (this is not a question but just a thought aloud
)。
一般來說,這不是一個知識的問題,回答你可以炫耀他們對別人的知識。不,這主要是好奇心的問題。對此的創造性反應比單純引用信息更爲合適,它本質上沒有給出答案,而是很容易想到「本文的作者(FAQ)最終會帶來什麼樣的有用信息?」。以及這個答案的作者。 – mezoni