2011-02-04 2 views
5

Я использую Apache commons cli (1.2) для синтаксического анализа командной строки.Scala error compiling OptionBuilder

У меня есть следующие в моем коде:

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

Я получаю ошибку hasArg is not a member of org.apache.commons.cli.OptionBuilder. Не имеет значения, если я изменю .hasArg на .hasArg().

Почему?

BTW, Java разбирает этот штраф.

+0

(Напоминание: Включите предупреждения в JAVAC/Затмении/везде.) –

+0

@pst: У меня есть их. Я работаю в Netbeans (лучшая поддержка Scala, IMHO), и он подчеркнул метод 'hasArg'. Я бы предпочел работать в IntelliJ, но плагин Scala имеет некоторые серьезные ошибки с переформатированием кода. Я отправил отчеты об ошибках, но до сих пор никаких исправлений не было. – Ralph

ответ

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

Я получаю ошибку hasArg is not a member of org.apache.commons.cli.OptionBuilder. Не имеет значения, если я изменю .hasArg на .hasArg().

Почему?

Поскольку не существует метода экземпляра hasArg в OptionBuilder только статический метод. Поскольку hasArg является статическим методом, вам, очевидно, нужно называть его классом, а не экземпляром класса.

BTW, Java разбирает этот штраф.

Я не понимаю, что это имеет отношение к разбору. Scala анализирует это тоже прекрасно. Плюс, то, что некоторые совершенно разные программы делают или не делают с этим кодом, совершенно неуместно, так как это код Scala, а не какой-то другой язык.

Вам нужно сделать что-то вроде этого:

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

Эгг, этот OptionBuilder имеет ужасный интерфейс! – pedrofurla

+4

@pedrofurla: он случайно работает на Java, потому что в Java статические методы могут быть вызваны на экземпляр, и если нет соответствующего метода экземпляра, вместо того, чтобы бросать ошибку, система будет молча преобразовывать его в вызов статического метода для вы. Таким образом, в Java это * выглядит как «Свободный интерфейс» с использованием метода Chaining, когда на самом деле это не так. Правильный способ сделать это, вероятно, должен был бы использовать объект промежуточного состояния для захвата вызовов метода, может быть, даже какого-то типа State Machine. –

+1

Важное слово в моем комментарии выше, конечно, «случайно». Поскольку @pst намекнул выше, это * будет * генерировать строгое предупреждение почти в любом Java IDE и/или редакторе, и большинство шашек стиля (CheckStyle, PMD, ...) отклонят его. –