将可变/命令循环重写为功能

时间:2018-06-19 02:49:06

标签: scala functional-programming

Set

我的代码使用ASM生成可以从给定起始集MethodNode调用的所有潜在entries的{​​{1}}。但是,我想以功能的方式重写它。集合的重复映射看起来绝对是递归的,尽管我无法完全理解如何去做。

我想出了这个,虽然它使用了稍微不同(但工作?)的逻辑。是否可以使用尾调用递归来编写它?

private def gatherMethods(current: Set[MethodNode]): Set[MethodNode] = {    
    val next = current.flatMap(                                             
        _.instructions.iterator.asScala                                     
        .flatMap(_ match {                                                  
            case m:MethodInsnNode => Some(MethodCall(m.owner, m.name, m.desc))
            case _ => None                                                  
        })                                                                  
    ).toSet.flatMap(findMethod _)                                           
    if(next == current) Set()                                               
    else current.union(gatherMethods(next))                                 
}                                                                           

0 个答案:

没有答案