Es ist lange her, seit ich C++ benutzt habe, und noch länger, seit ich mich mit harten Typen beschäftigt habe. Ich bin einfach auf der Suche nach einem arbeiten ein Liner, um ein Argument von v8 zu bekommen, oder einen Standardwert, wenn ein Argument nicht geliefert wurde.Kürzeste Möglichkeit (Einzeiler), um ein Standardargument aus einer v8-Funktion zu erhalten?
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";
Ausgänge:
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" }
Leider ist die folgende close-to-ideale Lösung ist für mich nicht (irgendwelche Ideen warum?):
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";
Ich gebe zu, ich weiß nicht, zu viel über v8, aber Ihr Ersatz sieht mächtig verdächtig aus einer C++ POV mir: Wann arg0/arg1/arg2 der Destruktoren laufen? Wann laufen diese Destruktoren in Ihrem One-Liner? Was passiert mit dem zugewiesenen Speicher, wenn der Destruktor der Klasse ausgeführt wird? – hvd
Hah, oh Gott ...also afaik (abgesehen von der Tatsache, dass alles in v8 statisch und für die Speicherverwaltung schrecklich ist, weil es eine JS-Engine ist, die überall Zugriff auf alles benötigt): args * könnte * zerstört werden, sobald meine Funktion zurückkehrt ... aber .. es ist sehr möglich dass v8 hängt an den Daten für seine interne "Stack-Tracing". Grundsätzlich weiß ich es nicht positiv, ich werde definitiv den Code erstellen, wenn es fertig ist. ;) –
Convoluted One Liner sind nicht gerade die "saubersten" Lösungen. –