scala - 如何在 Scala 中声明一个返回自身的函数(或另一个具有相同签名的函数)?

标签 scala

首先是背景——我正在编写一些代码来解码从套接字接收到的消息。套接字的性质意味着这些作为 ByteString 接收的消息可能是完整的、被截断的或与其他消息连接的。消息本身被分解为一个公共(public) header ,其中包含后面的可变数据的长度。

我的计划是让函数读取消息的各个部分,例如,第一次读取可以读取可变数据的长度,第二次读取可变数据本身。

当调用其中一个方法时,我希望它返回下一个操作,该操作可能是读取序列中的下一个逻辑操作,或者如果由于尚未接收到所有所需数据而无法执行特定读取,则返回其自身.

如果从套接字接收到的数据是完全成帧的,读取操作将在readLengthreadData 之间交替。但是,当从套接字中以多个 block 读取数据时,读取操作可能遵循 readLengthreadDatareadData 模式。

希望这是有道理的。

我想做的是这样的(由于循环引用而无法编译):

type ReadFunction = (ByteBuffer) => ReadFunction

这样我就可以声明这样的东西:

def readLength(buffer: ByteBuffer): ReadFunction = {

  if (buffer.limit - buffer.position > 4) {

    return readData(buffer.getInt)
  }
  else {

    return readLength
  }
}

def readData(length: Int)(buffer: ByteBuffer): ReadFunction = {

  if (buffer.limit - buffer.position > length) {

    val data: Array[Byte](size)
    buffer.get(data) 

    //process data

    readLength   
  }
  else {

    readData(length)
  }
}

现在我知道我可以(并且实际上已经)通过将读取操作定义为类来解决这个问题,这些类扩展了一个共同特征并返回每个特征的实例,但这看起来不像 Scala。

所以我的问题是 - 如何定义一个可以返回自身的函数?

最佳答案

不能在type 声明中使用循环引用,但可以在classtrait 声明中使用它,如下所示:

implicit class ReadFunction(f: Int => ReadFunction) extends (Int => ReadFunction) {
  def apply(i: Int) = f(i)
}

lazy val read: ReadFunction = { i: Int => println(i); read }

scala> read(1)(2)(3)
1
2
3
res0: ReadFunction = <function1>

关于scala - 如何在 Scala 中声明一个返回自身的函数(或另一个具有相同签名的函数)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20093425/

相关文章:

scala - 如何将这三种方法合二为一

scala - 喷雾客户端 - 将具有意外内容类型的响应视为应用程序/json?

scala - 从 Java 属性获取 Scala 映射

performance - Spark withColumn 性能

scala - Maven SBT 依赖 Artifact ?

scala - 生成客户端代码时可以更改包名称

scala - 如何在 Scala 中使用 foreach 循环来改变对象?

java - 如何在 Scala 中获取字符串的最后一个元音及其后面的任何单词?

scala - 您如何在用 Scala 编写的 JUnit 4 测试中实现 @BeforeClass 语义?

java - 如何...使用 MigLayout