Scala错误编译OptionBuilder

Ral*_*lph 5 parsing scala apache-commons-cli

我正在使用Apache commons cli(1.2)进行命令行解析.

我的代码中有以下内容:

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

我收到了错误hasArg is not a member of org.apache.commons.cli.OptionBuilder.这没有什么区别,如果我改变.hasArg.hasArg().

为什么?

BTW,Java解析这个问题.

Jör*_*tag 12

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

我收到了错误hasArg is not a member of org.apache.commons.cli.OptionBuilder.这没有什么区别,如果我改变.hasArg.hasArg().

为什么?

因为没有实例方法hasArgOptionBuilder,只有一个静态方法.既然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')
Run Code Online (Sandbox Code Playgroud)

  • 呃,这个OptionBuilder有一个可怕的界面! (6认同)
  • @pedrofurla:它无意中在Java中工作,因为在Java中,可以在实例上调用静态方法,如果没有相应的实例方法,系统会默默地将它转换为静态方法调用,而不是抛出错误.因此,在Java中,它看起来像使用方法链接的流畅接口,实际上它不是.执行此操作的正确方法可能是使用中间状态对象来捕获方法调用,甚至可能是某种类型状态机. (4认同)