理解单例类型的“apply”和“unapply”
Understanding `apply` and `unapply` with Singleton Type
鉴于:
import shapeless._
import syntax.singleton._
case class Foo(a: String, one: Witness.`1`.T)
为什么 Foo.apply _
和 Foo.unapply _
有不同的签名,分别是 Int(1)
和 Int
?
scala> Foo.apply _
res5: (String, Int(1)) => Foo = <function2>
scala> Foo.unapply _
res6: Foo => Option[(String, Int)] = <function1>
据我所知,在scala.tools.nsc.typechecker.Namers
(编译器代码)中,apply
使用由completerOf
生成和 caseApplyMethodCompleter
,而unapply
使用仅来自completerOf
。这个和可能的其他因素,可能是一些细微的错误,导致 unapply
丢失类型信息。 This change 稍微重构了代码并导致 both 方法通过新的 applyUnapplyMethodCompleter
,修复了它。由于似乎没有关于此问题的任何票据,真正的原因将需要一些额外的挖掘。假设这不是预期的行为可能是安全的。
鉴于:
import shapeless._
import syntax.singleton._
case class Foo(a: String, one: Witness.`1`.T)
为什么 Foo.apply _
和 Foo.unapply _
有不同的签名,分别是 Int(1)
和 Int
?
scala> Foo.apply _
res5: (String, Int(1)) => Foo = <function2>
scala> Foo.unapply _
res6: Foo => Option[(String, Int)] = <function1>
据我所知,在scala.tools.nsc.typechecker.Namers
(编译器代码)中,apply
使用由completerOf
生成和 caseApplyMethodCompleter
,而unapply
使用仅来自completerOf
。这个和可能的其他因素,可能是一些细微的错误,导致 unapply
丢失类型信息。 This change 稍微重构了代码并导致 both 方法通过新的 applyUnapplyMethodCompleter
,修复了它。由于似乎没有关于此问题的任何票据,真正的原因将需要一些额外的挖掘。假设这不是预期的行为可能是安全的。