다음은 다트 플랫폼에서이 eval
메서드를 사용하는 코드입니다.다트 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) \
P.S.
다트 메일 목록에서 질문 할 수 없으므로 여기에서 질문드립니다.
P.
우리가 그것을 mirrors_impl.dart
에서 static private method
을 볼 수 있듯이 :
static _eval(expression, privateKey) native "Mirrors_evalInLibraryWithPrivateKey";
사람이이 방법을 공개해야 원합니까? (this is not a question but just a thought aloud
).
일반적으로 지식에 대한 질문이 아니므로 다른 사람들에 대한 지식을 과시 할 수 있습니다. 아니요, 대부분 호기심에 관한 질문이었습니다. 그리고 그것에 대한 창조적 인 반응은 본질적으로 아무 대답도하지 않고 단순히 "이 텍스트의 저자가 결국 어떤 사람들에게 유용한 정보가 될 것인가?"에 대해 생각해 보려는 단순한 정보 인용보다 더 적절할 것입니다. 이 대답의 저자는 물론. – mezoni