辅助构造函数调用似乎未定义的方法
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。
我不清楚你所说的“未定义方法”是什么。如果您能澄清这一点,请编辑您的问题。
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。
我不清楚你所说的“未定义方法”是什么。如果您能澄清这一点,请编辑您的问题。