#v8 #embedded-v8
#версия 8 #встроенный-версия 8
Вопрос:
Итак, после некоторого отсутствия некоторые вещи изменились. Раньше я мог это делать:
void ObjectTemplateProxy::GetProperty(Local<String> hName, const PropertyCallbackInfo<Value>amp; info)
{
auto hStr = hName->ToString();
Но теперь мне нужен изолированный файл, и тип параметра изменен на Local<Name>
. Затем я попробовал это:
auto hStr = hName->ToString(info.GetIsolate());
Но это все равно не работает, потому что hStr
равно null. Это значение равно null, потому что, как выясняется, имя на самом деле является Symbol
типом, а не String
. Я не вижу никакого способа преобразовать символ в строку, что мне нужно сделать, чтобы отправить имя в C # CLR через P / Invoke, чтобы извлечь значение из словаря с помощью строковых ключей.
Ответ №1:
Итак, казалось бы, существует Name()
функция Symbol
типа, которая возвращает String
. Я искал функцию для Symbol
типа и не нашел ни одной (должно быть, пропустил ее). Код, который сработал, был hName.As<Symbol>()->Name().As<String>();
.
Как отмечено ниже в комментариях, Symbol()
имя не обязательно, так что будьте осторожны!
Комментарии:
1. Обратите внимание, что символы JavaScript не обязаны иметь имя (или другое строковое представление), поэтому API версии 8 также не может обеспечить такое преобразование. У вас могло бы быть:
var s = Symbol(); var t = Symbol(); var o = {}; o[s] = 42; o[t] = 123;
. Если вы вызоветеhName.As<Symbol>()->Name().As<String>() you'll get "undefined" (or a crash) for both
s` иt
. Вам понадобится ваше собственное преобразование Символ-> Строка таким образом, чтобы это имело смысл для вашего приложения.2. Учитывая, что в данный момент мне приходится перенаправлять его на сторону CLR для поиска по словарю строк, я собираюсь применить требование к имени, но спасибо за предупреждение. Мне нужно будет добавить это в мой
TODO:
список и просмотреть позже, лол. 😉