3

以下代码:

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 方法?这是出于性能原因以及代码重用。

4

1 回答 1

3

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

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

@RexKerr 的这个回答说得够多了。

于 2016-11-29T14:12:17.927 回答