这是在凿子库里面
object Module {
// returns a new Module of type T, initialized with a Parameters instance if _p !=None.
def apply[T<:Module](c: =>T)(implicit _p: Option[Parameters] = None):T
}
我不明白=
参数中的符号。它代表什么?
这是在凿子库里面
object Module {
// returns a new Module of type T, initialized with a Parameters instance if _p !=None.
def apply[T<:Module](c: =>T)(implicit _p: Option[Parameters] = None):T
}
我不明白=
参数中的符号。它代表什么?
=
in正在为参数(implicit _p: Option[Parameters] = None)
分配默认值。这意味着除非另有说明,否则没有分配给 的实例。None
_p
Parameter
_p
以防万一您询问=>
in (c: =>T)
,=>
is 表示第一个参数c
是对返回实例的函数的引用T
,其中T
是 的子类Module
。
这里使用了 Scala 的一系列惯用特性:函数柯里化、隐式参数、函数作为该语言的一等公民。花一点时间来学习这些东西的语法是值得的。查看 Chisel 的generator-bootcamp 教程,特别是第 3.2 和 3.3 节,了解 Chisel 利用 Scala 语法的一些方法
这个例子有两个=
标志。第一个对应于 By-name 参数:https ://docs.scala-lang.org/tour/by-name-parameters.html 。
前者很重要,因为 Chisel 中的模块在Module(...)
构建时必须包含在内。我们通常使用按名称调用来完成:
class MyModule extends Module {
...
}
// This works!
def func(mod: => MyModule) = {
val instance = Module(mod) // The module is constructed inside Module(...)
}
func(new MyModule)
// This doesn't work!
def func(mod: MyModule) = {
val instance = Module(mod)
}
func(new MyModule) // The module is constructed too early, here!
第二个是默认参数:https ://docs.scala-lang.org/tour/default-parameter-values.html 。这主要是一个方便的事情:
def func(x: Int = 3) = { println(x) }
func(5) // prints 5
func() // prints 3