布尔Scala/凿子的选择方法
我试图理解RocketChip中AsyncQueue的实现,对布尔数据类型(而非option)上使用option方法感到非常困惑。 在代码中,我们有一个parametr类:布尔Scala/凿子的选择方法,scala,chisel,rocket-chip,Scala,Chisel,Rocket Chip,我试图理解RocketChip中AsyncQueue的实现,对布尔数据类型(而非option)上使用option方法感到非常困惑。 在代码中,我们有一个parametr类: case class AsyncQueueParams( depth: Int = 8, sync: Int = 3, safe: Boolean = true, narrow: Boolean = false) { require (depth > 0 &&
case class AsyncQueueParams(
depth: Int = 8,
sync: Int = 3,
safe: Boolean = true,
narrow: Boolean = false)
{
require (depth > 0 && isPow2(depth))
require (sync >= 2)
val bits = log2Ceil(depth)
val wires = if (narrow) 1 else depth
}
当使用上述方法时:
class AsyncBundle[T <: Data](private val gen: T, val params: AsyncQueueParams = AsyncQueueParams()) extends Bundle {
val mem = Output(Vec(params.wires, gen))
val ridx = Input (UInt((params.bits+1).W))
val widx = Output(UInt((params.bits+1).W))
val index = params.narrow.option(Input(UInt(params.bits.W)))
// Signals used to self-stabilize a safe AsyncQueue
val safe = params.safe.option(new AsyncBundleSafety) // <--- Never seen use of option !!
}
class-AsyncBundle[T作为导入(请参阅)
在包对象中,有一个扩展方法
implicit class BooleanToAugmentedBoolean(private val x: Boolean) extends AnyVal {
def toInt: Int = if (x) 1 else 0
// this one's snagged from scalaz
def option[T](z: => T): Option[T] = if (x) Some(z) else None
}
这是在这里定义的
这种模式在scala库中通常被称为“扩展”或“语法”,您可以在其中定义您不拥有或不想将该方法与核心数据结构耦合的类型上的方法。在较旧的文献中,您可能还会发现“XRich”或“XOps”具有相同的含义
在scala 2中,当您有someBoolean.option(…)时,执行此操作的机制是via
在您的代码中,编译器将在Boolean
中搜索方法,如果没有找到,它将尝试在它可以将Boolean
转换为的所有其他类中进行搜索。在这种情况下,在范围中存在从Boolean
到Boolean到ugmentedboolean
的隐式转换,编译器找到了opti在那里的
方法上
注意,隐式类只是普通类的语法糖&隐式会话,即
隐式类BooleanToAugmentedBoolean(private val x:Boolean)扩展了AnyVal{
def toInt:Int=if(x)1其他0
定义选项[T](z:=>T):选项[T]=如果(x)某些(z)其他无
}
语法上的糖是什么
类BooleanToAugmentedBoolean(private val x:Boolean)扩展了AnyVal{
def toInt:Int=if(x)1其他0
定义选项[T](z:=>T):选项[T]=如果(x)某些(z)其他无
}
隐式定义f(x:Boolean)=新布尔值到增强布尔值(x)
implicit class BooleanToAugmentedBoolean(private val x: Boolean) extends AnyVal {
def toInt: Int = if (x) 1 else 0
// this one's snagged from scalaz
def option[T](z: => T): Option[T] = if (x) Some(z) else None
}