没有`apply`方法的申请?

时间:2017-07-04 08:20:28

标签: scala scalacheck

我注意到org.scalacheck.Properties文件中的以下代码:

  /** Used for specifying properties. Usage:
   *  {{{
   *  property("myProp") = ...
   *  }}}
   */
  class PropertySpecifier() {
    def update(propName: String, p: Prop) = props += ((name+"."+propName, p))
  }

  lazy val property = new PropertySpecifier()

我不确定调用property("myProp") = ...时发生了什么。类apply中没有PropertySpecifier方法。那么,这里叫什么?

1 个答案:

答案 0 :(得分:1)

您可能会注意到该用法不仅显示应用程序,还显示其他内容,即=符号。通过让您的类实现update方法,您可以让编译器如何更新此类的 state 并允许property("myProp") =语法。

您可以在Array上找到相同的行为,apply执行读访问和update写访问。

以下是一个可以用来理解这一点的小例子:

final class Box[A](private[this] var item: A) {

  def apply(): A =
    item

  def update(newItem: A): Unit =
    item = newItem

}

val box = new Box(42)
println(box()) // prints 42
box() = 47 // updates box contents
println(box()) // prints 47