Ha pasado mucho tiempo desde que utilicé C++, e incluso más tiempo desde que envolví mi cabeza en los tipos duros. Simplemente estoy buscando un trabajando un liner para obtener un argumento de v8, o un valor predeterminado cuando no se proporcionó un argumento.¿La forma más corta (una línea) para obtener un argumento predeterminado de una función 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";
Salidas:
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" }
Por desgracia, la seguía de cerca-a-ideales solución no funciona para mí (cualquier idea por qué?):
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";
voy a admitir que no sé demasiado sobre v8, pero su reemplazo se ve poderoso sospechoso de un C++ POV para mí: cuando los destructores do arg0/arg1/arg2 de correr? ¿Cuándo se ejecutan esos destructores en tu línea única? ¿Qué sucede con la memoria asignada cuando se ejecuta el destructor de la clase? – hvd
Hah, oh Dios ...afaik (aparte del hecho de que todo en v8 es estático y horrible para la administración de memoria porque es un motor JS que necesita acceso a todo en todas partes): args * might * se destruirá una vez que mi función regrese ... pero ... es muy posible ese v8 se cuelga en los datos para su "seguimiento de pila" interno. Básicamente, no lo sé de manera positiva, definitivamente estaré perfilando el código cuando esté terminado. ;) –
Convoluted one liners no son exactamente las soluciones "más limpias". –