Scala公共方法:';'预期但发现'def'

Posted

技术标签:

【中文标题】Scala公共方法:\';\'预期但发现\'def\'【英文标题】:Scala public methods: ';' expected but 'def' foundScala公共方法:';'预期但发现'def' 【发布时间】:2011-09-08 00:22:40 【问题描述】:

我写了这个方法:

public def getXScaleFactor(panelWidth: Int): Double = 
  return (panelWidth / (samplesContainer[0].length.asInstanceOf[Double]))

我在编译时遇到问题:

[error] ./src/main/scala/Controllers/TrackController.scala:85: ';' expected but 'def' found.
[error]   public def getXScaleFactor(panelWidth: Int): Double 
[error]          ^

这段代码有什么问题?

【问题讨论】:

【参考方案1】:

public 不是 Scala 中的保留字,因此它将其解释为变量名。公共访问是默认设置;离开public,你会没事的。

【讨论】:

【参考方案2】:

方法默认是公开的。删除public

【讨论】:

谢谢!我认为这是可选的,现在我发现它根本不允许。【参考方案3】:

只是把上面的答案加起来:

您也可以删除return 关键字。函数/方法中的最后一条语句/表达式自动成为返回值。

【讨论】:

【参考方案4】:

问题在于您编写了 Java 代码。

除了public,您还使用[] 对集合进行索引访问(这是无效的)、显式返回类型(不需要)、return(这也是' t 需要)和.asInstanceOf(这是不必要的,而且有代码味道)

试试这个以获得轻量级、更惯用的体验:

def xScaleFactor(panelWidth: Int) =
  panelWidth / samplesContainer.head.length.toDouble

或者如果samplesContainer 可能为空:

def xScaleFactor(panelWidth: Int) =
  panelWidth / samplesContainer.headOption.map(_.length.toDouble).getOrElse(42.0)

将您喜欢的任何内容替换为默认的42

【讨论】:

+1 用于彻底校对。 samplesContainer(0).length.toDouble 没什么问题,不过,这取决于 samplesContainer 是什么——我猜是一个数组,而且我不会在数组惯用语上调用 head 由于未指定,我在这里假设一个数组是失职的,因此必须考虑索引可访问集合类型的最普遍可能性。 Seq 在这种情况下。

以上是关于Scala公共方法:';'预期但发现'def'的主要内容,如果未能解决你的问题,请参考以下文章

Scala案例类私有构造函数但公共应用方法

Scala:指定公共方法覆盖受保护的方法

当类型参数具有公共类型时,Scala添加扩展方法

CompletableFuture 没有被执行。如果我使用 ExecutorService 池,它可以按预期工作,但不能使用默认的 forkJoin 公共池

错误:“公共”之前的预期不合格 ID

Scala中的公共变量?