Function0 上的 Scala 堆栈修改

标签 scala stack-overflow traits

我刚刚在 Scala 的堆栈修改中遇到了非常奇怪的行为。

让我们看一个例子:

class Base extends Function0[Unit] {
  override def apply(): Unit = println("base")
}

trait Modification extends Function0[Unit] {
  abstract override def apply(): Unit = { print("modified "); super.apply() }
}

val a = new Base with Modification
a.apply()

我希望输出类似于修改后的基础。 相反,我得到了 modifiedmodifiedmodified... 导致 StackOverflowError

有趣的是,这种情况只发生在 Function0[Unit] 中。函数[String]工作正常:

class Base extends Function0[String] {
  override def apply(): String = "base"
}

trait Modification extends Function0[String] {
  abstract override def apply(): String = "modified " + super.apply()
}

val a = new Base with Modification
a.apply()

输出:

defined class Base
defined trait Modification
a: Base with Modification = <function0>
res0: String = modified base

有人可以解释一下这种行为吗?

最佳答案

看起来像一个错误,因为使用自定义 Function0 一切都按预期工作

trait Function0[+R] {
  def apply(): R
}

class Base extends Function0[Unit] {
  override def apply(): Unit = println("base")
}

trait Modification extends Function0[Unit] {
  abstract override def apply(): Unit = { print("modified "); super.apply() }
}

val a = new Base with Modification

a.apply() // modified base

错误应在此处报告:https://github.com/scala/bug/issues

关于Function0 上的 Scala 堆栈修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58580830/

相关文章:

c - 关于缓冲区溢出的练习

unit-testing - 当 `Result`不是 `Copy`时,设计单元测试

Scala:如何在特征中添加依赖于类型的方法?

java - OpenGL 的关键。 Java/斯卡拉/ python

scala - 如何在scaladoc中生成到标准库类型的链接?

PHP 不处理堆栈溢出?

java - 构造函数有问题吗?

java - 我可以在 Maven 中编译具有依赖关系的混合 java 和 scala 代码的 Scala 项目吗?

mysql - 选择...使用 Anorm 进行更新

function - 如何从泛型函数返回具体类型?