引き続きv8.hを読みながらNodeモジュールを書く練習をする。
モジュールのメソッド定義ですが、名前の通りv8::Argumentsが引数の表現で、[]オペレータでアクセスするとv8::Value型のそれぞれの引数が得られる。型チェックはIsNumberやらIsStringといったメソッドはあっても、型を直接返してくれる物は無いのでやや面倒。
試しに、こんなモジュールを作ってみる。
呼び出し側のコード
実行結果
クラスメソッドしか持たないモジュールはこの書き方がわかれば作れそう。あと、コードを書く時はIDEの支援が欲しいので、Xcodeでソース開いてv8とnodeのコードをヘッダ検索パスに追加した状態で作業した方が楽できますね。
続きます
Node.jsのモジュールをC++で書く (ObjectとArrayを受け取るメソッド)
http://d.hatena.ne.jp/hagino_3000/20120320/1332228809
モジュールのメソッド定義ですが、名前の通りv8::Argumentsが引数の表現で、[]オペレータでアクセスするとv8::Value型のそれぞれの引数が得られる。型チェックはIsNumberやらIsStringといったメソッドはあっても、型を直接返してくれる物は無いのでやや面倒。
試しに、こんなモジュールを作ってみる。
#include <node.h> #include <v8.h> #include <iostream> using namespace v8; // 引数の数と、それぞれの型をチェックするメソッド Handle<Value> ArgumentTest(const Arguments& args) { HandleScope scope; for (int i = 0; i < args.Length(); i++) { if (args[i]->IsString()) { std::cout << "String!!" << std::endl; } else if (args[i]->IsFunction()) { std::cout << "Function!!" << std::endl; } else if (args[i]->IsObject()) { std::cout << "Object!!" << std::endl; } else { // Number or Boolean or Date ... etc } } return scope.Close(v8::Number::New(args.Length())); } // 第一引数をそのままreturnするメソッド Handle<Value> ReturnTest(const Arguments& args) { HandleScope scope; return scope.Close(args[0]); } // メソッドのexport定義 void init(Handle<Object> target) { target->Set(String::NewSymbol("argumentTest"), FunctionTemplate::New(ArgumentTest)->GetFunction()); target->Set(String::NewSymbol("returnTest"), FunctionTemplate::New(ReturnTest)->GetFunction()); } NODE_MODULE(Test1, init)
呼び出し側のコード
var Test1 = require('./build/Release/Test1'); console.log("Check arguments..."); var result = Test1.argumentTest("str", function(){}, {hoge:100}); console.log(result + ' arguments passed'); console.log(""); console.log("Check return value type"); console.log(typeof(Test1.returnTest("str"))); console.log(typeof(Test1.returnTest(100))); console.log(typeof(Test1.returnTest(new Date()))); console.log(typeof(Test1.returnTest(function(){})));
実行結果
Check arguments... String!! Function!! Object!! 3 arguments passed Check return value type string number object function
クラスメソッドしか持たないモジュールはこの書き方がわかれば作れそう。あと、コードを書く時はIDEの支援が欲しいので、Xcodeでソース開いてv8とnodeのコードをヘッダ検索パスに追加した状態で作業した方が楽できますね。
続きます
Node.jsのモジュールをC++で書く (ObjectとArrayを受け取るメソッド)
http://d.hatena.ne.jp/hagino_3000/20120320/1332228809