从v8函数中获取默认参数的最短路径(单线程)?

Cal*_*ray 5 c++ v8 node.js node.js-addon

自从我使用C++以来已经有很长一段时间了,甚至更长时间以来我一直围绕着硬类型.我只是在寻找一个工作的衬管来从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";
Run Code Online (Sandbox Code Playgroud)

输出:

func(); // { username: "", password: "", service: "login" }
func('1'); // { username: "1", password: "", service: "login" }
func('1', '2'); // { username: "1", password: "2", service: "login" }
func('a', 'b', 'c'); // { username: "a", password: "b", service: "c" }

不幸的是,以下接近理想的解决方案对我不起作用(任何想法为什么?):

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";
Run Code Online (Sandbox Code Playgroud)

Cal*_*ray 8

维亚切斯拉夫·叶戈罗夫(Vyacheslav Egorov)用他的评论钉住了它,当我访问该字符串时,它已被销毁.最终我最终使用:

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;
}
Run Code Online (Sandbox Code Playgroud)

用法示例:

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

    ...
}
Run Code Online (Sandbox Code Playgroud)

  • PS我会接受比我自己更好的答案.我真的很讨厌回答自己的问题. (2认同)