Javascript生成器函数——用C++编写
Javascript generator function -- written in C++
使用V8 C++API,如何实现用于Javascript的生成器接口?我想创建一个可以用作for-of
循环迭代器的对象。
看起来首先需要检查Symbol.iterator
:的属性查找
NAN_PROPERTY_GETTER(My_Obj::Getter) {
auto self = Nan::ObjectWrap::Unwrap<My_Obj>(info.This());
if (property->IsSymbol()) {
if (Nan::Equals(property, v8::Symbol::GetIterator(info.GetIsolate())).FromJust()) {
...
使用不带参数的函数进行响应。该函数返回一个next
属性设置为另一个函数的对象:
...
auto iter_template = Nan::New<v8::FunctionTemplate>();
Nan::SetCallHandler(iter_template, [](const Nan::FunctionCallbackInfo<v8::Value> &info) {
auto next_template = Nan::New<v8::FunctionTemplate>();
Nan::SetCallHandler(next_template, My_Obj::next, info.Data());
auto obj = Nan::New<v8::Object>();
Nan::Set(obj, Nan::New<v8::String>("next").ToLocalChecked(),
next_template->GetFunction());
info.GetReturnValue().Set(obj);
}, info.This());
info.GetReturnValue().Set(iter_template->GetFunction());
...
next
函数也不接受任何参数。它在每次调用时按顺序返回迭代值。我使用的是一个C++迭代器:
NAN_METHOD(My_Obj::next) {
auto self = Nan::ObjectWrap::Unwrap<My_Obj>(info.Data().As<v8::Object>());
bool done = self->iter == self->contents.end();
auto obj = Nan::New<v8::Object>();
Nan::Set(obj, Nan::New<v8::String>("done").ToLocalChecked(),
Nan::New<v8::Boolean>(done));
if (!done) {
Nan::Set(obj, Nan::New<v8::String>("value").ToLocalChecked(),
Nan::New<v8::String>(self->iter->first.c_str()).ToLocalChecked());
}
self->iter++;
info.GetReturnValue().Set(obj);
}
我将状态保持在包裹的对象本身。这使得该生成器不可重入。这对于读/写对象来说可能很好,对于只读对象来说,可能需要另一种状态保持方法。
示例对象的完整代码可用。
相关文章:
- 正在为Xtensa simcall函数编写回调函数
- 在程序中编写脚本来编写和编译代码
- 编写时C++中的输入重定向问题
- 在C++中,如何在类和函数(可能是模板化的)的头中编写完整的实现
- c++多进程编写一个唯一的文件
- 如何用C++编写BFS函数
- 编写代码时C++出现错误:错误 1 错误 C2601:'circle':本地函数定义是非法的
- 如何编写一个使用n倍三元条件语句的C++布尔函数
- 为C++03编译器编写部分unique_ptr,该编译器与较新的编译器在公共代码库上运行
- 如何为 C 型字符串数组编写 getter 和 setter?
- 如何在没有函数的情况下编写此代码并使C++更简单?
- 编写一个函数以使用 n 百分比的 CPU 使用率
- 如何使用OpenCV-C++编写*.mp4视频?
- 3-3. 编写一个程序来计算每个不同单词在其输入中出现的次数
- 我的目标是编写一个程序来计算和存储字符串在字符数组中出现的位置
- 如何编写带有异常的构造函数
- 如何为包含头文件的目标编写生成文件?
- 如何编写一个完美的缩写函数模板?
- 如何编写已继承的大纲构造函数?
- 我编写了代码将十进制分数转换为其二进制等效数.它编译得很好,但在执行时挂起