2013-07-27 17 views
5

Bunu Ruby'de buldum, ancak Python'da yaptığım şeyden tanıyorum; "uyarısı" operatörü. Uzun lafın kısası, “uyarım” operatörünün ne yaptığını taklit etmenin daha kolay bir yolu olup olmadığını merak ediyorum.Splat operatörü taklit etmek için daha kolay bir alternatif var mı?

Geri kalanının arayabileceği merkezi bir yöntem yaptım çünkü çok benzer olanlarım olduğunu fark ettim ve hepsi de birkaç küçük şey hariç aynı şeyi yapıyorlardı. İşte yöntem imzası:

private String callScript(String scriptLocation, String... extraArgs) throws Exception { 

Ben en az bir argüman (scriptLocation) gerektirir ve daha sonra ekstra herhangi bir sayıda argüman izin vermek istiyorum. Bununla yaptığım şey, bir ProcessBuilder oluşturmaktır. Benim arzum böyle bir şey yapmaktır: Yani

  • List<String>
  • String[]
  • String...

: gibi

ProcessBuilder pb = new ProcessBuilder("something", scriptLocation, /* extraArgs */); 

Ama tabii, ProcessBuilder yapıcı yalnızca kabul şeyler benim yaklaşımım açıkça işe yaramaz. ince olarak bildiğim kadarıyla çalışır

Bulunduğum geçici çözüm, geçerli:

List<String> finalArgs = new ArrayList<String>(); 
finalArgs.add("something"); 
finalArgs.add(scriptLocation); 
finalArgs.addAll(Arrays.asList(extraArgs)); 
ProcessBuilder pb = new ProcessBuilder(finalArgs); 

(evet, ben List kullanmak gerekmez anlamak ve sadece String[] yapabiliriz)

(ve evet, ben extraArgs aracılığıyla döngü olabilir anlamak ve yerine addAll ve Arrays.asList() kullanmak zorunda kalmadan, tek tek finalArgs eklemek) (

bir nd evet, değişken argümanlarla birleştirilmiş belirli argümanları döndürerek, geçici çözümümüzü başarılı bir şekilde yürütebildiğimi biliyorum. Bu yüzden bu son üç ifadenin dışında, bunu başarabilecek bir şey var mıdır?

+1

'Dize ...' aslında 'String []'. İlk parametreyi zorlamak için "String s1", "String [] s2ToN" gibi parametrelerinizi bölerseniz, yeni bir dizi/liste içinde bir kopya oluşturmak onları birleştirmek için yapabileceğiniz tek şeydir. – zapl

+0

@zapl Üzgünüm, bunu biliyordum ama bu kısmı yanlış anladım/gözden geçiriyor gibi görünüyor. Yani temelde şu anki yaklaşımımın (bazı şekillerde) bunun üstesinden gelmenin tek yolu olduğunu mu söylüyorsun? Sorun değil, sadece bir şey eksik olduğunu bilmiyordum – Ian

+0

Soruyu anladığımdan emin değilim ... Listeye bazı dizeler koymak için daha iyi bir yol mu arıyorsunuz? – jtahlborn

cevap

1

Daha basit tanımına bağlıdır, ancak Oluşturucu desen kullanan bir sınıf yazabilirsiniz:

public class MyProcessBuilder { 
    List<String> args; 

    MyProcessBuilder(String text, String location) { 
     args = new ArrayList<String>(); 
     args.add(text); 
     args.add(location); 
    } 

    MyProcessBuilder arg(String arg) { 
     args.add(arg); 
     return this; 
    } 

    MyProcessBuilder args(String... args) { 
     this.args.addAll(Arrays.asList(args)); 
     return this; 
    } 

    public ProcessBuilder go() { 
     return new ProcessBuilder(args); 
    } 

    public static MyProcessBuilder callScript(String location) { 
     return new MyProcessBuilder("something", location); 
    } 

    public static void main(String[] args) { 
     callScript("/tmp/bla").arg("something else").arg("more").go(); 
    } 
} 
+0

Neden böyle bir şey düşünmediğimi bilmiyorum, ama kesinlikle iyi bir öneri; Teşekkürler! – Ian

0

splat() bir yardımcı program yazıp bunu yayımladınız mı?Eğer Sonra birçok yönden bu yöntemi çağırabilirsiniz

public ProcessBuilder(String something, String scriptLocation, String... extraArgs); 

varsa

ProcessBuilder pb = new ProcessBuilder("something", scriptLocation, /* extraArgs */); 

çağırdığınızda

List<String> finalArgs = new ArrayList<String>(); 

finalArgs.addAll(Arrays.asList("something")); 
finalArgs.addAll(Arrays.asList(scriptLocation)); 
finalArgs.addAll(Arrays.asList(extraArgs))); 

ProcessBuilder pb = new ProcessBuilder(finalArgs); 
0

: :)

Bu daha düzgün görünebilir

ProcessBuilder pb = new ProcessBuilder("something", "/tmp/script.sh"); 

ProcessBuilder pb = new ProcessBuilder("something", "/tmp/script.sh","someArg"); 

ProcessBuilder pb = new ProcessBuilder("something", "/tmp/script.sh","someArg","someArg2"); 



ProcessBuilder pb = new ProcessBuilder("something", "/tmp/script.sh"); 

ProcessBuilder pb = new ProcessBuilder("something", "/tmp/script.sh",new String[]{}); 

ProcessBuilder pb = new ProcessBuilder("something", "/tmp/script.sh",new String[]{"someArg"}); 

ProcessBuilder pb = new ProcessBuilder("something", "/tmp/script.sh",new String[]{"someArg","someArg2"}); 



ArrayList<String> someStringList = new ArrayList<String>(); 
someStringList .add("SomeArg"); 
someStringList .add("SomeArg2"); 
String[] extraArgs = someStringList .toArray(new String[someStringList .size()]); 
ProcessBuilder pb = new ProcessBuilder("something", "/tmp/script.sh",extraArgs); 
İlgili konular