繁体   English   中英

Scala语法糖,用于透明调用一元对象上的一元对象

[英]Scala syntactic sugar for transparently invoking a unary apply on a companion object

class OpenNLPAnnotator extends ThreadLocal[OpenNLPAnnotatorInstance] {
  override def initialValue = new OpenNLPAnnotatorInstance
}

object OpenNLPAnnotator {
  private lazy val ann_ = new OpenNLPAnnotator
  private def ann = ann_
  def apply = ann.get()
}

我有什么办法可以通过执行OpenNLPAnnotator.someMethodOnTheTLV来获得TLV? 我必须写OpenNLPAnnotator.apply.someMethodOnTheTLV

编辑

根据下面的答案,我认为这样的事情将是最好的

object OpenNLPAnnotator {
  private lazy val ann_ = new OpenNLPAnnotator
  private def ann = ann_
  def apply() = ann.get()
  def annotator = ann.get
}

然后我就可以做annotator.whatever

当然,这需要导入,因此,除非我将其放入包对象中,否则它会摇摆不定。 尽管我还没有使用过包对象,也不了解它的来龙去脉。

隐式调用apply方法的唯一方法是在对象名称后添加括号,如下所示:

OpenNLPAnnotator().someMethodOnTheTLV

但是您必须更改apply方法声明(添加括号):

def apply() = ann.get()

讨厌的骇客

您可以创建从OpenNLPAnnotator.typeOpenNLPAnnotator的隐式转换,如下所示:

implicit def nastyHack(o: OpenNLPAnnotator.type): OpenNLPAnnotator = o.apply

因此,您可以在伴随对象上调用OpenNLPAnnotator所有方法。

OpenNLPAnnotator.someMethodOnTheTLV将被转换为此:

nastyHack(OpenNLPAnnotator).someMethodOnTheTLV

注意(针对您的编辑):

您可以在导入时重命名apply方法:

import OpenNLPAnnotator.{apply => annotator}

您有两种选择:

  1. 等待我使用宏重写autoproxy (它将在释放scala 2.11.0-RC1的同时完成)

  2. 使用其他模式!

您知道单身人士可以从同伴那里继承吗?

class OpenNLPAnnotator extends ThreadLocal[OpenNLPAnnotatorInstance] {
  override def initialValue = new OpenNLPAnnotatorInstance
}

object OpenNLPAnnotator extends OpenNLPAnnotator {
  def apply = this.get()
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM