如何将 v8::Local<v8::Value> 转换为 uint32_t
How to convert a v8::Local<v8::Value> into a uint32_t
给定以下代码,我如何将 v8::Local 转换为 uint32_t。还是其他基于Is*方法的类型?
v8::Local<v8::Value> value;
v8::Local<v8::Context> context = v8::Context::New(v8::Isolate::GetCurrent());
if(value->IsUint32()) {
v8::MaybeLocal<Int32> maybeLocal = value->Uint32Value(context);
uint32_t i = maybeLocal;
}
您发布的代码无效,因为 value->Uint32Value(context)
没有 return 和 v8::MaybeLocal<Int32>
。 C++ 类型是你的朋友(就像 TypeScript 一样)!
你有两种可能:
(1) 您可以使用 Value::Uint32Value(...)
,其中 return 是 Maybe<uint32_t>
。由于您已经检查了 value->IsUint32()
,此转换不会失败,因此您可以使用 Maybe::ToChecked()
.
提取包裹在 Maybe
中的 uint32_t
(2) 您可以使用 Value::ToUint32(...)
,其中 return 是 MaybeLocal<Uint32>
。同样,由于您已经检查了 value->IsUint32()
,它不会失败,因此您可以通过 MaybeLocal::ToLocalChecked()
获得 Local<Uint32>
,然后只需使用 ->
语法调用包装的 Uint32
的Value()
方法,它给出了uint32_t
.
如果您只对最后的 uint32_t
感兴趣(而不对中间的 Local<Uint32>
感兴趣,您可以将其传递回 JavaScript),那么选项 (1) 的效率会稍微高一些。
请注意,IsUint32()
会像 {valueOf: () => 42; }
一样为 objects 说 false
。如果你想处理这样的objects,那么尝试转换,并处理失败,例如:
Maybe<uint32_t> maybe_uint = value->Uint32Value(context);
if (maybe_uint.IsJust()) {
uint32_t i = maybe_uint.FromJust();
} else {
// Conversion failed. Maybe it threw an exception (use a `v8::TryCatch` to catch it), or maybe the object wasn't convertible to a uint32.
// Handle that somehow.
}
另外请注意,大多数这些概念都在 V8 的 samples and API tests 中进行了说明。阅读 API headers 中的评论和实现本身也提供了很多见解。
最后说明:您可能希望跟踪您正在使用的当前上下文,而不是每次需要时都创建一个新的上下文。
给定以下代码,我如何将 v8::Local
v8::Local<v8::Value> value;
v8::Local<v8::Context> context = v8::Context::New(v8::Isolate::GetCurrent());
if(value->IsUint32()) {
v8::MaybeLocal<Int32> maybeLocal = value->Uint32Value(context);
uint32_t i = maybeLocal;
}
您发布的代码无效,因为 value->Uint32Value(context)
没有 return 和 v8::MaybeLocal<Int32>
。 C++ 类型是你的朋友(就像 TypeScript 一样)!
你有两种可能:
(1) 您可以使用 Value::Uint32Value(...)
,其中 return 是 Maybe<uint32_t>
。由于您已经检查了 value->IsUint32()
,此转换不会失败,因此您可以使用 Maybe::ToChecked()
.
Maybe
中的 uint32_t
(2) 您可以使用 Value::ToUint32(...)
,其中 return 是 MaybeLocal<Uint32>
。同样,由于您已经检查了 value->IsUint32()
,它不会失败,因此您可以通过 MaybeLocal::ToLocalChecked()
获得 Local<Uint32>
,然后只需使用 ->
语法调用包装的 Uint32
的Value()
方法,它给出了uint32_t
.
如果您只对最后的 uint32_t
感兴趣(而不对中间的 Local<Uint32>
感兴趣,您可以将其传递回 JavaScript),那么选项 (1) 的效率会稍微高一些。
请注意,IsUint32()
会像 {valueOf: () => 42; }
一样为 objects 说 false
。如果你想处理这样的objects,那么尝试转换,并处理失败,例如:
Maybe<uint32_t> maybe_uint = value->Uint32Value(context);
if (maybe_uint.IsJust()) {
uint32_t i = maybe_uint.FromJust();
} else {
// Conversion failed. Maybe it threw an exception (use a `v8::TryCatch` to catch it), or maybe the object wasn't convertible to a uint32.
// Handle that somehow.
}
另外请注意,大多数这些概念都在 V8 的 samples and API tests 中进行了说明。阅读 API headers 中的评论和实现本身也提供了很多见解。
最后说明:您可能希望跟踪您正在使用的当前上下文,而不是每次需要时都创建一个新的上下文。