【问题标题】:Passing a method in auxiliary constructors在辅助构造函数中传递方法
【发布时间】:2012-10-03 17:15:51
【问题描述】:

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

目前我有以下:

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.")
  }
}

这工作正常,但我想用default 替换构造函数中的{ position => () }),但这样做会导致错误“未找到:默认值”。

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

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

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

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

【问题讨论】:

    标签: scala


    【解决方案1】:

    这应该可以工作(删除了奇怪的类型以使其可编译):

    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)没有定义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-28
      • 2011-06-28
      • 1970-01-01
      • 1970-01-01
      • 2019-01-10
      • 1970-01-01
      • 2014-08-20
      相关资源
      最近更新 更多