[英]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.type
到OpenNLPAnnotator
的隐式转换,如下所示:
implicit def nastyHack(o: OpenNLPAnnotator.type): OpenNLPAnnotator = o.apply
因此,您可以在伴随对象上调用OpenNLPAnnotator
所有方法。
OpenNLPAnnotator.someMethodOnTheTLV
将被转换为此:
nastyHack(OpenNLPAnnotator).someMethodOnTheTLV
注意(针对您的编辑):
您可以在导入时重命名apply方法:
import OpenNLPAnnotator.{apply => annotator}
您有两种选择:
等待我使用宏重写autoproxy (它将在释放scala 2.11.0-RC1的同时完成)
使用其他模式!
您知道单身人士可以从同伴那里继承吗?
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.