在辅助构造函数中传递方法

时间:2012-10-03 17:15:51

标签: scala

我正在尝试创建一个接受函数的类,但是,我希望这是可选的,如果调用者将其删除,我希望用默认函数替换它。

目前我有以下内容:

class MenuItem(val text: String, val onClick: (Vector2f) => Unit) extends Renderable {
  def this(text: String) = this(text, { position => () })

  private def default(position: Vector2f) = {
    println(text + " was clicked, but is still using the default event.")
  }
}

这很好但我想用{ position => () })替换构造函数中的default,但这样做会导致错误'not found:value default'。

我尝试在没有私有修饰符的情况下声明默认值,但这没有帮助。

我想出的最佳解决方案就是声明:

def this(text: String) = this(text, position => println(text + " was clicked, but is still using the default event."))

有没有办法可以保留定义的默认方法并只使用它的名称,还是我必须坚持实现内联方法?

1 个答案:

答案 0 :(得分:4)

这应该有效(删除了奇怪的类型以使其可编辑):

object MenuItem {
    def default(text: String, position: AnyRef) = {
        println(text + " was clicked, but is still using the default event.")
    }
}

class MenuItem(val text: String, val onClick: (AnyRef) => Unit) {
    def this(text: String) = this(text, MenuItem.default(text, _))
}

访问您尝试构造的对象的方法不起作用,因为只有在构造它时才能访问它。

来自Language Specification Section 5.3.1

  

构造函数的签名和自构造函数调用   定义是在类型检查和评估范围内进行的   在封闭的阶级定义点上的效果,由任何增加   封闭类的类型参数和任何早期定义   封闭模板的(第5.1.6节)。

'self构造函数调用是对主构造函数的调用。并且因为它在封闭类的范围内进行类型检查意味着它不会看到类中的方法。

这是一件好事,因为在调用主构造函数之前,未定义实例的字段(在本例中为text)。