Как преобразовать локальное в строку?

#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: список и просмотреть позже, лол. 😉