【问题标题】:Scala inline unapply extractorScala内联取消应用提取器
【发布时间】:2017-04-13 12:23:09
【问题描述】:

以下代码:

object Test {
  @inline def unapply(i: Int): Option[String] =
    i match {
      case 1 => Some("Got 1")
      case 2 => Some("Got 2")
      case 3 => throw new Exception("Should not test 3")
      case _ => None
  }
  def test(i: Int) = i match {
    case Test(k) => k
    case 4 => "Another 4"
    case _ => ""
  }
}
Test.test(3)

导致以下错误:

...
at Test$.unapply(<console>:13)
at Test$.test(<console>:17)
...

请注意,错误的来源很清楚。但是,错误表明方法 unapply 没有按照我的意愿内联。
我怎样才能内联这个 unapply 方法?这是出于性能原因以及代码重用。

【问题讨论】:

  • 我不确定,但即使方法是内联的,Scala 能否保持原始堆栈跟踪?
  • 您期望性能提升到什么水平??
  • @marstran 我检查了反汇编,我可以确认该方法没有内联。事实上,JVM 允许在内联函数上生成调试代码。
  • @Pavel A 升级。
  • “检查异常错误列表”是什么意思?通常在反汇编文件底部的那个?据我所知,没有。

标签: scala inline extractor


【解决方案1】:

@inline请求编译器尝试内联方法,但它不是必须的,在某些情况下,它不能。我不认为编译器可以内联和不能内联的规范(尽管如果有的话我很想看看),但我敢打赌编译器在这种情况下根本不会,不不管你做什么。

通常,无论如何,您只想内联一些常量或较小且不太可能更改的内容。否则,Test.unapply 的大量使用将导致编译后的代码大小迅速增加,并且对内联方法的更改将在引用它的所有内容中激增。

来自@RexKerr 的This answer 说得够多了。

【讨论】:

    猜你喜欢
    • 2017-05-11
    • 2014-06-24
    • 2015-08-16
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    相关资源
    最近更新 更多