【问题标题】:scala: toString for synthetic classes and functionsscala: toString 用于合成类和函数
【发布时间】:2016-02-11 12:55:35
【问题描述】:

我认为在 scala 中编程的最大缺点是,由于大量代码是合成/匿名类的一部分,堆栈跟踪和默认的“toString”日志通常几乎无用。

编译器生成更有用的类名/toString 方法是否有充分的理由/障碍?我觉得将方法具体化为函数和分配给命名 val 的函数至少是打印方法/val 名称而不是“函数”的良好候选者。让 lambdas 的类名显示定义它们的方法的名称也很好,但类似 ​​'$$lambda' 之类的东西会有所改进。

可能可以使用宏来完成 - 有人已经这样做了,还是深入研究 scala 宏的好人选?

【问题讨论】:

  • 您的问题是什么?目前,这似乎更像是一个提议/咆哮,而不是一个实际的问题。
  • 宏只会让情况变得更糟。你需要破解底层的 JVM 来修复你的堆栈跟踪。
  • “有人已经这样做了吗?”而且我相信如果不影响生成的类的名称,宏至少可以添加一个更有帮助的“toString”实现。我不知道它们是否纯粹在本地工作,或者是否可以将内联类更改为命名实体

标签: scala anonymous-function anonymous-class


【解决方案1】:

这种方法存在几个问题。

首先,您只能围绕宏的上下文进行扩展,即直接在应用宏的位置进行扩展,因此最后您的代码必须将每个函数都封装在某个方法中(然后将树扩展为具有 toString 方法),如下所示,相当难看。

val test = Macro.addToString((f: Int) => f + 10)

其次,虽然您是正确的,但当前 scala 函数是匿名内部函数,但在下一个版本中不会出现这种情况,因为它们将与 Java 8 兼容。这意味着函数的扩展略有不同,我相信您将无法采用这种方法anyway

您可以尝试使用 scala 编译器插件,我相信这将是完成您想做的事情的好方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多