【问题标题】:Scala error compiling OptionBuilderScala 错误编译 OptionBuilder
【发布时间】:2011-02-04 21:48:24
【问题描述】:

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

我的代码中有以下内容:

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() 没有区别。

为什么?

顺便说一句,Java 解析得很好。

【问题讨论】:

  • (提醒:在javac/Eclipse/wherever中开启警告。)
  • @pst:我有他们。我在 Netbeans 工作(最好的 Scala 支持,恕我直言),它强调了 hasArg 方法。我更喜欢在 IntelliJ 中工作,但是 Scala 插件在重新格式化代码时存在一些严重的错误。我已提交错误报告,但到目前为止,尚未发布任何修复。

标签: parsing scala apache-commons-cli


【解决方案1】:
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() 没有区别。

为什么?

因为OptionBuilder 中没有实例方法hasArg,只有静态方法。由于hasArg 是一个静态方法,你显然需要在类上调用它,而不是在类的实例上。

顺便说一句,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')

【讨论】:

  • 呃,这个 OptionBuilder 的界面很糟糕!
  • @pedrofurla:它在Java中意外工作,因为在Java中,可以在实例上调用静态方法,如果没有对应的实例方法,而不是抛出错误,系统会静默转换它变成了一个静态方法调用你。因此,在 Java 中,它看起来像一个使用方法链的 Fluent Interface,但实际上并非如此。这样做的正确方法可能是使用中间状态对象来捕获方法调用,甚至可能是某种类型状态机。
  • 我上面评论中的重要词当然是“意外”。正如上面@pst 所暗示的,这在几乎任何Java IDE 和/或编辑器中生成一个严厉的警告,并且大多数样式检查器(CheckStyle、PMD、...)都会拒绝它。
  • 当然!我没有想到这一点(Java 会在类的实例上调用静态方法)。除了你建议打破个别行之外,还有什么方法可以在 Scala 中完成同样的事情?顺便说一句,我同意OptionBuilder 的界面很糟糕。
  • 有人刚刚问并删除了一个重复的问题,我正要回答这个类在主干,FWIW 中已弃用。但 Scala 拒绝与它互操作真是太好了。
猜你喜欢
  • 1970-01-01
  • 2011-11-12
  • 2021-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多