1

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

目前我有以下内容:

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但这样做会导致错误“未找到:值默认值”。

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

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

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

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

4

1 回答 1

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, _))
}

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

语言规范第 5.3.1 节

构造函数定义的签名和自构造函数调用在封闭类定义时有效的范围内进行类型检查和评估,并由封闭类的任何类型参数和任何早期定义(§5.1 .6) 的封闭模板。

'self 构造函数调用是对主构造函数的调用。而且由于它是在封闭类的范围内进行类型检查的,这意味着它看不到类内的方法。

这是一件好事,因为在调用主构造函数之前,text没有定义实例的字段(在这种情况下)。

于 2012-10-03T17:33:30.607 回答