Scala 内联 unapply 提取器
Scala inline unapply extractor
以下代码:
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 方法?这是出于性能原因以及代码重用。
@inline
仅请求 编译器尝试内联一个方法,但它没有必要,在某些情况下,它不能。我不认为编译器可以内联什么和不能内联什么有一个规范(尽管如果有的话我很想看看),但我敢打赌编译器在这种情况下根本不会,不不管你做什么。
通常,您只想内联一些常量或较小且不太可能更改的内容。否则,Test.unapply
的多次使用将导致编译代码的大小迅速增加,并且对内联方法的更改将扩散到引用它的所有内容。
来自@RexKerr 的This answer 说的够多了。
以下代码:
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 方法?这是出于性能原因以及代码重用。
@inline
仅请求 编译器尝试内联一个方法,但它没有必要,在某些情况下,它不能。我不认为编译器可以内联什么和不能内联什么有一个规范(尽管如果有的话我很想看看),但我敢打赌编译器在这种情况下根本不会,不不管你做什么。
通常,您只想内联一些常量或较小且不太可能更改的内容。否则,Test.unapply
的多次使用将导致编译代码的大小迅速增加,并且对内联方法的更改将扩散到引用它的所有内容。
This answer 说的够多了。