有没有办法在makeOrderedLeafList匹配块中定义insert函数?
由于insert函数仅用于makeOrderedLeafList,我想在其中定义它。但是,如果放在底部,则需要出现错误"单位"。不能放在顶部作为" case"正在预料中。
def makeOrderedLeafList(freqs: List[(Char, Int)]): List[Leaf] = freqs match {
case List() => List()
case h :: t => insert(h, makeOrderedLeafList(t))
case _ => throw new IllegalStateException
}
//--------------------------------------------------------------------------------
// Insert Leaf in the sorted list of Leaf.
//--------------------------------------------------------------------------------
def insert(c: (Char, Int), list: List[Leaf]): List[Leaf] = list match {
case List() => List(new Leaf(c._1, c._2))
case h :: t => {
//--------------------------------------------------------------------------------
// If C:[char, counter] is smaller, prepend it to the List[Leaf].
// Otherwise, recurse call insert to find a position in the tail of the list.
//--------------------------------------------------------------------------------
if (c._2 <= h.weight) new Leaf(c._1, c._2) :: list
else h :: insert(c, t)
}
}
答案 0 :(得分:3)
在调用之前将它放在盒子里面:
color = sns.color_palette("husl",3)[i] + (1.,)
case表达式的右侧可以是返回预期类型的任何代码块。代码块可以包含函数定义。
答案 1 :(得分:0)
如果在外部函数调用中定义了函数,它将在每次调用外部函数时创建一个新的内部函数实例。
val getInnerFuncHash = () => {
val func = (x: Int) => x + 1
func.hashCode().toString
}
println(getInnerFuncHash())
println(getInnerFuncHash())
println(getInnerFuncHash())
这将打印内部函数的hashCodes,并输出类似的内容,
1136974570
1030088901
2115208183
这意味着每次调用外部函数都会创建一个新的内部函数实例。
defs
def getInnerFuncHash(): String = {
val func = (x: Int) => x + 1
func.hashCode().toString()
}
println(getInnerFuncHash())
println(getInnerFuncHash())
println(getInnerFuncHash())