ret*_*nym 38 scala case-class companion-object
当你创建一个类的情况下,编译器创建了几个案例类东西的相应配套对象:一个apply工厂方法相匹配的主构造,equals,hashCode,和copy.
奇怪的是,这个生成的对象扩展了FunctionN.
scala> case class A(a: Int)
defined class A
scala> A: (Int => A)
res0: (Int) => A = <function1>
Run Code Online (Sandbox Code Playgroud)
只有在以下情况下才会这样:
有没有人使用它,或者知道它为什么被添加?它使用静态转发器方法稍微增加了生成的字节码的大小,并显示在#toString()伴随对象的方法中:
scala> case class A()
defined class A
scala> A.toString
res12: java.lang.String = <function0>
Run Code Online (Sandbox Code Playgroud)
UPDATE
使用单个apply方法手动创建的对象不会自动视为FunctionN:
object HasApply {
def apply(a: Int) = 1
}
val i = HasApply(1)
// fails
// HasApply: (Int => Int)
Run Code Online (Sandbox Code Playgroud)
Mar*_*sky 48
case类伴随对象实现FunctionN的原因是之前,case类生成了一个类和一个工厂方法,而不是一个伴随对象.当我们向Scala添加提取器时,使用apply和unapply方法将工厂方法转换为完整的伴随对象更有意义.但是,由于工厂方法确实符合FunctionN,因此伴随对象也需要符合.
[编辑]那就是说,让伴侣对象显示为自己的名字,而不是"功能"是有意义的
oxb*_*kes 11
好吧,鉴于target.apply(a1, a2, a3 ... aN)Scala:
target(a1, a2, a3 ... aN)FunctionN一个伴侣对象似乎很自然:
object MyClass {
def apply(a1 : A1, ... aN: AN) = new MyClass(a1, ..., aN)
}
Run Code Online (Sandbox Code Playgroud)
是真的:
object MyClass extends FunctionN[A1, ... , AN, MyClass]{
def apply(a1 : A1, ... aN: AN) = new MyClass(a1, ..., aN)
}
Run Code Online (Sandbox Code Playgroud)
所以添加对我来说似乎很自然(我不确定为什么它对你来说似乎"奇怪"?).至于它是否真的添加了任何东西; 好吧,那是为了比我聪明的人!
Mil*_*bin 11
除了oxbow_lakes关于它的自然性的回复之外,将构造函数作为第一类函数提供通常是有用的,特别是与Scala集合的高阶函数结合使用.对于(一个微不足道的)例子,
scala> case class Foo(i : Int)
defined class Foo
scala> List(1, 2, 3) map Foo
res0: List[Foo] = List(Foo(1), Foo(2), Foo(3))
Run Code Online (Sandbox Code Playgroud)
Welcome to Scala version 2.8.0.RC3 (Java HotSpot(TM) Client VM, Java 1.6.0_20).
scala> case class CC3(i: Int, b: Boolean, s: String)
defined class CC3
scala> CC3
res0: CC3.type = <function3>
scala> CC3.apply(1, true, "boo!")
res1: CC3 = CC3(1,true,boo!)
scala> CC3(1, true, "boo!")
res2: CC3 = CC3(1,true,boo!)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3135 次 |
| 最近记录: |