Scala中的$( )是什么意思?

7

我在阅读apache-spark的代码时遇到了这个问题:

    val alpha = new DoubleParam(this, "alpha", "alpha for implicit preference",
                                ParamValidators.gtEq(0)) 
    /** @group getParam */
    def getAlpha: Double = $(alpha)

我在网上搜索了很长时间,但仍然找不到关于这里的$(alpha)是什么意思的好解释。它如何将一个自定义类DoubleParam变量分配给Double?谢谢!

顺便说一下,DoubleParam类被定义为:

class DoubleParam(parent: String, name: String, doc: String, isValid: Double => Boolean)
  extends Param[Double](parent, name, doc, isValid) {

  def this(parent: String, name: String, doc: String) =
    this(parent, name, doc, ParamValidators.alwaysTrue)

  def this(parent: Identifiable, name: String, doc: String, isValid: Double => Boolean) =
    this(parent.uid, name, doc, isValid)

  def this(parent: Identifiable, name: String, doc: String) = this(parent.uid, name, doc)

  /** Creates a param pair with the given value (for Java). */
  override def w(value: Double): ParamPair[Double] = super.w(value)
}

请查看以下链接,其中定义了Scala符号:http://docs.scala-lang.org/tutorials/FAQ/finding-symbols.html - Rahul Gopi
@RahulGopi 实际上这与 Scala 本身无关。这是第三方库引入的语法,很可能是 Spark 引入的。 - om-nom-nom
@om-nom-nom,我本来以为这个常见问题解答会说明并描述如何在Scaladoc中查找这些方法,但它没有。 - Alexey Romanov
@AlexeyRomanov 他们接受PR是个好消息 - om-nom-nom
@om-nom-nom:虽然Scala现在已经有宏了,但你不能在第三方库中引入语法。(不过你可以为现有语法引入新的语义。)它只是像其他方法一样的一个方法。 - Jörg W Mittag
显示剩余4条评论
1个回答

9

$()是Spark中在Params特质中定义的一个函数。它只是在Params对象上调用getOrDefault方法。

它的定义如下:

/** An alias for [[getOrDefault()]]. */
protected final def $[T](param: Param[T]): T = getOrDefault(param)

谢谢!这正是我想要的! - PunyTitan
很高兴听到@PunyTitan。如果您对答案感到满意,那么您可以简单地接受它作为问题的答案,以表达您的感激之情 :-) - Till Rohrmann
谢谢!是的,在Spark 2.2.0中,它位于spark\mllib\src\main\scala\org\apache\spark\ml\param\params.scala - snark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接