辅助构造函数调用似乎未定义的方法

Auxiliary constructor invoking what seems to be an undefined method

OOP 新手。以下scala代码用于Diplomacy,一个参数协商框架。

package chipsalliance.rocketchip

object config { 
  //OP: Definition of View, Field omitted
  abstract class Parameters extends View {
    final def ++ (x: Parameters): Parameters =
      new ChainParameters(this, x)

    final def alter(f: (View, View, View) => PartialFunction[Any,Any]): Parameters =
      Parameters(f) ++ this

    final def alterPartial(f: PartialFunction[Any,Any]): Parameters =
      Parameters((_,_,_) => f) ++ this

    final def alterMap(m: Map[Any,Any]): Parameters =
      new MapParameters(m) ++ this

    protected[config] def chain[T](site: View, tail: View, pname: Field[T]): Option[T]
    protected[config] def find[T](pname: Field[T], site: View) = chain(site, new TerminalView, pname)
  }

  object Parameters {
    def empty: Parameters = new EmptyParameters
    def apply(f: (View, View, View) => PartialFunction[Any,Any]): Parameters = new PartialParameters(f)
  }

  class Config(p: Parameters) extends Parameters {
    def this(f: (View, View, View) => PartialFunction[Any,Any]) = this(Parameters(f))

    protected[config] def chain[T](site: View, tail: View, pname: Field[T]) = p.chain(site, tail, pname)
    override def toString = this.getClass.getSimpleName
    def toInstance = this
  }

  // Internal implementation:
  // OP: Some private classes omitted  
  private class PartialParameters(f: (View, View, View) => PartialFunction[Any,Any]) extends Parameters {
    protected[config] def chain[T](site: View, tail: View, pname: Field[T]) = {
      val g = f(site, this, tail)
      if (g.isDefinedAt(pname)) Some(g.apply(pname).asInstanceOf[T]) else tail.find(pname, site)
    }
  }
}

据我了解,Config class 的辅助构造函数(使用部分函数文字作为参数)调用主构造函数(使用参数 class 的伴随对象的应用方法)必须通过调用 PartialParameters(f) return 参数对象(或 class?)。在我看来,受保护的方法chain只是Parameters superclass;中抽象链的具体实现;并且当 PartialParameters(f) 为 created/called/invoked 时不会被求值(因为它不是构造函数)。那么,PartialParameters(f) 在哪里求值呢?

如果我从根本上遗漏了一些东西,我很感激任何提示或材料链接。

您的分析是正确的,所以 new Config(f) 基本上是 new Config(new PartialParameters(f)) 的 shorthand。当它是 evaluated/executed 时,你有一个 Config 对象包装了一个 PartialParameters 对象,但是参数的 chain 方法没有被它的构造函数调用。

Statements/expressions 在 Scala 中默认是热切的 executed/evaluated,就像在任何其他命令式语言中一样。然而,在 Scala 中,您还可以实现惰性求值。对于该函数参数,必须通过在其类型前加上 => 来显式标记为 by name

我不清楚你所说的“未定义方法”是什么。如果您能澄清这一点,请编辑您的问题。