用于链表样式函数调用的CPS样式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用于链表样式函数调用的CPS样式相关的知识,希望对你有一定的参考价值。

我试图将以下代码转换为继续传递样式。代码最初返回一个String所以我改变它来调用一个继续lambda采取String。我想知道如何删除next字段并使用CPS样式。

class Foo(val x: Double) {
  var next: Foo = _

  def bar(y: Double, returnLambda: (String => Unit)): Unit = {
    if (x * y > 0) {
      returnLambda("Bad")
    } else if (next == null) {
      returnLambda("Good!")
      next = new Foo(y)
    } else {
      next.bar(y, returnLambda)
    }
  }
}
答案

看起来你构建了一个单独链接的Foo值列表;只要新值的符号与现有值不同,就会在列表末尾添加新值。

在功能方法中,您不会在列表中的对象中嵌入列表管理。相反,您将单独维护一个列表,var next: List[Foo],并通过以下方式执行追加:

if ( next.all( _ * y <= 0) )
  returnLambda("Bad")
else {
  returnLambda("Good")
  next = next :+ Foo(y)
}

由于我们已经压缩了列表操作,CPS的使用失去了它的好处;你可以简单地返回字符串“Good”或“Bad”。

假设您确实需要CPS,可以通过将next字段移动到伴随对象中来删除它:

object Foo {
  val listOfFoo: ListBuffer[Foo] = ListBuffer[Foo].empty

  def bar(y: Double,  returnLambda: (String => Unit)): Unit = 
    if ( listOfFoo.all(_ * y <= 0) )
      returnLambda("Bad")
    else {
      listOfFoo += Foo(y)
      returnLambda("Good")
    }
}

以上是关于用于链表样式函数调用的CPS样式的主要内容,如果未能解决你的问题,请参考以下文章

src,href 和rel的区别

创建用于在 MFC 控件上使用 printf 样式字符串格式显示状态更新的函数

markdown 用于比较在PHP Raw中编写`clamp`函数的各种样式的代码量

markdown 代码复杂性报告,用于比较在PHP Raw Raw中编写`clamp`函数的各种样式

这里如何调用 setInterval?

php 一个自定义的try..catch包装器代码片段,用于执行模型函数,使其成为一个单行函数调用