2011-02-04 20 views
5

Używam Apache commons cli (1.2) do parsowania linii poleceń.Błąd kompilacji Scala OptionBuilder

Mam następujących w moim kodu:

import org.apache.commons.cli.OptionBuilder 
OptionBuilder.withLongOpt("db-host").hasArg. 
withDescription("Name of the database host").create('h') 

pojawia się błąd hasArg is not a member of org.apache.commons.cli.OptionBuilder. Nie ma znaczenia, czy zmienię .hasArg na .hasArg().

Dlaczego?

BTW, Java analizuje to dobrze.

+0

(Przypomnienie: Włącz ostrzeżenia w javac/Eclipse/gdziekolwiek.) –

+0

@pst: Mam je. Pracuję w Netbeans (najlepsze wsparcie dla Scala, IMHO) i podkreślono metodę 'hasArg'. Wolałbym pracować w IntelliJ, ale wtyczka Scala ma kilka poważnych błędów z formatowaniem kodu. Przesłałem zgłoszenia błędów, ale jak dotąd żadne poprawki nie zostały opublikowane. – Ralph

Odpowiedz

12
import org.apache.commons.cli.OptionBuilder 
OptionBuilder.withLongOpt("db-host").hasArg. 
withDescription("Name of the database host").create('h') 

pojawia się błąd hasArg is not a member of org.apache.commons.cli.OptionBuilder. Nie ma znaczenia, czy zmienię .hasArg na .hasArg().

Dlaczego?

Ponieważ nie istnieje metoda przykład hasArg w OptionBuilder tylko metodą statyczną. Ponieważ hasArg jest metodą statyczną, oczywiście musisz wywołać ją na klasie, a nie na instancji klasy.

BTW, Java analizuje tę sytuację.

Nie rozumiem, co to ma wspólnego z parsowaniem. Scala również to dobrze. Co więcej, to, co zupełnie inne programowanie robi lub nie robi z tym kodem, jest całkowicie nieistotne, ponieważ jest to kod Scala, a nie jakikolwiek inny język.

Trzeba zrobić coś takiego:

import org.apache.commons.cli.OptionBuilder 

OptionBuilder.withLongOpt("db-host") 
OptionBuilder.hasArg 
OptionBuilder.withDescription("Name of the database host") 

val optionParser = OptionBuilder.create('h') 
+6

Ergh, ten OptionBuilder ma okropny interfejs! – pedrofurla

+4

@pedrofurla: To przypadkowo działa w Javie, ponieważ w Javie statyczne metody mogą być wywoływane na instancjach, a jeśli nie ma odpowiedniej metody instancji, zamiast rzucać błąd, system po cichu przekształci go w statyczne wywołanie metody ty. Dlatego w Javie * wygląda * jako płynny interfejs wykorzystujący metodę łańcuchową, podczas gdy w rzeczywistości tak nie jest. Właściwym sposobem na to byłoby prawdopodobnie użycie obiektu stanu pośredniego do przechwytywania wywołań metod, może nawet pewnego rodzaju Maszyny stanu typu. –

+1

Ważnym słowem w powyższym komentarzu jest oczywiście "przypadkowo". Jak wspomniano powyżej @ pst, to * spowoduje * wygenerowanie surowego ostrzeżenia w prawie każdym Java IDE i/lub edytorze, a większość kontrolerów stylu (CheckStyle, PMD, ...) odrzuci go. –