最简单的方法(单行)从v8函数获取默认参数?

自从我使用C ++以来,已经有很长的一段时间了,甚至更长的时间,因为我把自己的头围绕在硬的types上。 我只是寻找一个工作class轮从v8获得参数,或者当一个参数没有提供时的默认值。

v8::String::Utf8Value arg0(args[0]); v8::String::Utf8Value arg1(args[1]); v8::String::Utf8Value arg2(args[2]); const char *username = (args.Length() > 0) ? *arg0 : ""; const char *password = (args.Length() > 1) ? *arg1 : ""; const char *service = (args.Length() > 2) ? *arg2 : "login"; 

输出:

 FUNC();  // {用户名:“”,密码:“”,服务:“login”}
 FUNC( '1');  // {用户名:“1”,密码:“”,服务:“login”}
 func('1','2');  // {用户名:“1”,密码:“2”,服务:“login”}
 func('a','b','c');  // {用户名:“a”,密码:“b”,服务:“c”}

不幸的是,下面接近理想的解决scheme不适合我(任何想法为什么?):

 const char *username = (args.Length() > 0) ? *v8::String::Utf8Value(args[0]->ToString()) : ""; const char *password = (args.Length() > 1) ? *v8::String::Utf8Value(args[1]->ToString()) : ""; const char *service = (args.Length() > 2) ? *v8::String::Utf8Value(args[2]->ToString()) : "login"; 

维亚切斯拉夫·叶戈罗夫(Vyacheslav Egorov)用他的评论把它钉在了它上面,当我接触到这个string时,它已经被毁坏了。 最终我最终使用:

 char *get(v8::Local<v8::Value> value, const char *fallback = "") { if (value->IsString()) { v8::String::AsciiValue string(value); char *str = (char *) malloc(string.length() + 1); strcpy(str, *string); return str; } char *str = (char *) malloc(strlen(fallback) + 1); strcpy(str, fallback); return str; } 

用法示例:

 v8::Handle<v8::Value> myMethod(const v8::Arguments &args) { char *username = get(args[0], "user"); char *password = get(args[1], "pass"); ... } 

这段代码对于我在一行中从v8值中提取string值效果很好:

 std::string tempString(*v8::String::Utf8Value(args[someInteger])); 

std :: string构造函数应该可以处理你的默认场景,而不需要额外的代码,但是如果你确实需要手动检查空值,这很简单。

这个代码作为一个例子,它获得所有参数的string值,并将它们打印到标准输出,当然,把它们放入一个很好的数组,因为什么用途打印出来?

 std::string* printAllArgs(const Arguments& args){ std::cout << "PRINTING ALL ARGS: "; std::string* stringArray = new std::string[args.Length()]; for(int i = 0; i < args.Length(); i++){ std::string tempString(*v8::String::Utf8Value(args[i])); stringArray[i] = tempString; std::cout << tempString << ";"; } return stringArray; } 

AsciiValue是正确的临时AsciiValue对象已被自动销毁,如智能指针在紧凑的表示法:

 const char *username = *v8::String::Utf8Value(args[0]->ToString()); //transient AsciiValue object has gone out of scope, and its destructor has been called in // previous line, rendering the pointer (content) invalid henceforth! ... 

这是因为AsciiValue已经超出了单线范围的范围。

相反,如果打算多次使用“caching”指针,应将其分解为2行:

 { v8::String::Utf8Value usernameObj(args[0]->ToString()); const char *username = *usernameObj; ... //use username pointer as often as desired; it remains valid in this entire scope. doSomethingWithString(username); //OK //can also dereference Utf8Value object only when needed: doSomethingWithString(*usernameObj); //OK } //here, usernameObj is out of scope and is destroyed, and username will become invalid. 

如果只打算使用一次string值,那么使用紧凑符号仍然是完全可以的:

 doSomethingWithString(*v8::String::Utf8Value(args[0]->ToString())); //OK 

doSomethingWithString函数获取正确的值来处理。 只有从它返回,那么Utf8Value自动销毁。

同样的事情发生在String :: AsciiValue。

 string bi = info[0]->IsUndefined() ? "backwardIndex.dat" : string(*Nan::Utf8String(info[0]));