2011-02-04 13 views
5

Sto usando Apache commons cli (1.2) per l'analisi della riga di comando.Errore di compilazione Scala OptionBuilder

Ho il seguente nel mio codice:

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

ottengo l'errore hasArg is not a member of org.apache.commons.cli.OptionBuilder. Non fa alcuna differenza se cambio .hasArg in .hasArg().

Perché?

BTW, Java analizza questa multa.

+0

(Promemoria: Attivare le avvertenze riportate nella javac/Eclipse/ovunque.) –

+0

@pst: li ho su. Sto lavorando su Netbeans (il miglior supporto per Scala, IMHO) e ha sottolineato il metodo 'hasArg'. Preferirei lavorare in IntelliJ, ma il plugin Scala ha alcuni bug gravi con il codice di riformattazione. Ho inviato segnalazioni di bug, ma finora non sono state pubblicate correzioni. – Ralph

risposta

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

ottengo l'errore hasArg is not a member of org.apache.commons.cli.OptionBuilder. Non fa alcuna differenza se cambio .hasArg in .hasArg().

Perché?

Poiché non esiste un metodo esempio hasArg in OptionBuilder, solo un metodo statico. Poiché hasArg è un metodo statico, è ovviamente necessario chiamarlo sulla classe, non su un'istanza della classe.

BTW, Java analizza questa multa.

Non capisco cosa questo abbia a che fare con l'analisi. Scala lo analizza anche bene. Inoltre, ciò che alcuni programmi completamente diversi fanno o non fanno con questo codice è assolutamente irrilevante, poiché questo è il codice Scala, non un altro linguaggio.

è necessario fare qualcosa di simile:

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, questo OptionBuilder ha un'interfaccia orribile! – pedrofurla

+4

@pedrofurla: funziona accidentalmente in Java, perché in Java, i metodi statici possono essere richiamati su un'istanza e, se non esiste un metodo di istanza corrispondente, anziché lanciare un errore, il sistema lo convertirà automaticamente in una chiamata di metodo statico per tu. Pertanto, in Java, * assomiglia * a un'interfaccia fluente usando il metodo di concatenamento, quando in realtà non lo è. Il modo corretto per farlo è probabilmente quello di usare un oggetto di stato intermedio per catturare le chiamate al metodo, magari anche una sorta di macchina a stati di tipo. –

+1

La parola importante nel mio commento sopra è ovviamente "accidentalmente". Come @ pst accennato sopra, questo * genererà un avviso severo in quasi tutti i Java IDE e/o editor, e la maggior parte dei controllori di stile (CheckStyle, PMD, ...) la rifiuterà. –