C++ kullandığımdan beri uzun bir zaman geçti ve başımı sert türlerin etrafına sardığımdan beri daha uzun bir süre geçti. Ben sadece bir argüman verilmediyse, bir argümanı v8'den almak için bir tek liner çalışıyorum.V8 işlevinden varsayılan argüman almak için en kısa yol (tek liner)?
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";
Çıkışlar: Maalesef
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" }
, yakın-to-ideal çözüm (herhangi bir fikir neden?) Benim için çalışmıyor Aşağıdaki:
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";
Kabul ediyorum V8 hakkında çok fazla şey bilmiyorum, ama değiştireceğiniz bir C++ POV'den şüpheli görünüyor bana: ne zaman arg0/arg1/arg2'nin yıkıcıları çalışıyor? Bu tahripçiler tek linonuzda ne zaman çalışır? Sınıfın yıkıcısı çalıştırıldığında ayrılmış belleğe ne olur? – hvd
Hah, oh Tanrım ...yani afaik (v8'deki her şeyin, bellek yönetimi için statik ve korkunç olduğu gerçeğinin yanı sıra her yerde her şeye erişmesi gereken bir JS motoru): args * fonksiyonu * döndüğünde * imha edilebilir ... ama .. çok mümkün v8, dahili "yığın izleme" için verilere kilitleniyor. Temel olarak, olumlu bir şekilde bilmiyorum, bittiğinde kodu kesinlikle profillendireceğim. ;) –
Döşenmiş bir gömlek tam olarak "en temiz" çözümler değildir. –