복붙노트

[SCALA] 왜 케이스 클래스 동반자 개체는 기능을 확장 할 수 있습니까?

SCALA

왜 케이스 클래스 동반자 개체는 기능을 확장 할 수 있습니까?

당신이 경우 클래스를 만들 때, 컴파일러는 경우 클래스 케이크의 몇 가지에 해당하는 동반자 객체를 만듭니다는 기본 생성자, 동일, 해시 코드, 및 복사와 일치하는 팩토리 메소드를 적용합니다.

다소 이상하게이 생성 된 객체 기능을 확장한다.

scala> case class A(a: Int)                                 
defined class A

scala> A: (Int => A)
res0: (Int) => A = <function1>

이것은 단지의 경우 경우입니다 :

이 2 년전에 대해 추가 된 것 같다. 최신 화신은 여기에있다.

사람이를 사용하거나이 추가 된 이유를 알고 있나요? 그것은 컴패니언 개체 #toString () 메소드에서 정적 전달자 방법 및 프로그램을 위로 조금 발생 바이트의 크기를 증가시킨다 :

scala> case class A()
defined class A

scala> A.toString
res12: java.lang.String = <function0>

최신 정보

수동 자동 기능으로 간주되지 않는 하나의 적용 방법과 객체를 생성 :

object HasApply {
  def apply(a: Int) = 1
}
val i = HasApply(1)

// fails
//  HasApply: (Int => Int) 

해결법

  1. ==============================

    1.경우 클래스 동반자 FunctionN 스를 구현하는 이유는 이전의 경우 클래스가 클래스와 팩토리 메소드가 아닌 동반자 객체를 생성한다는 것이다. 우리가 스칼라에 추출기를 추가하는 경우는 적용하고 적용 취소 방법과 전체 동반자 객체로 공장 출하 방법을 설정하는 더 이해했다. 공장 출하 방법은 FunctionN을 따르지 않았기 때문에 그런데, 동반자 객체도 준수 할 필요가 있었다.

    경우 클래스 동반자 FunctionN 스를 구현하는 이유는 이전의 경우 클래스가 클래스와 팩토리 메소드가 아닌 동반자 객체를 생성한다는 것이다. 우리가 스칼라에 추출기를 추가하는 경우는 적용하고 적용 취소 방법과 전체 동반자 객체로 공장 출하 방법을 설정하는 더 이해했다. 공장 출하 방법은 FunctionN을 따르지 않았기 때문에 그런데, 동반자 객체도 준수 할 필요가 있었다.

    [편집] 즉, 동반자 객체가없는 "기능"으로, 자신의 이름으로 표시하도록 감각을 만들 것이라고 말했다

  2. ==============================

    2.그래서, 주어진 target.apply (A1, A2, A3 ... AN) 스칼라 :

    그래서, 주어진 target.apply (A1, A2, A3 ... AN) 스칼라 :

    그것은 동반자 개체가 자연 것 같습니다 :

    object MyClass {
      def apply(a1 : A1, ... aN: AN) = new MyClass(a1, ..., aN)
    }
    

    정말 :

    object MyClass extends FunctionN[A1, ... , AN, MyClass]{
      def apply(a1 : A1, ... aN: AN) = new MyClass(a1, ..., aN)
    }
    

    추가가 나에게 자연스러운 것 같다 그래서 (당신을 "이상한"것 있는지 왜 아니에요?). 실제로 아무것도 추가 여부에; 글쎄, 그건 나보다 똑똑한 사람입니다!

  3. ==============================

    3.그외의 자연 스러움에 대한 oxbow_lakes의 답변에서, 종종 특히 고차 기능 스칼라 컬렉션과 함께, 일류의 기능으로 사용할 수 생성자를 가질 유용 할 수 있습니다. (사소한) 예를 들어,

    그외의 자연 스러움에 대한 oxbow_lakes의 답변에서, 종종 특히 고차 기능 스칼라 컬렉션과 함께, 일류의 기능으로 사용할 수 생성자를 가질 유용 할 수 있습니다. (사소한) 예를 들어,

    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))
    
  4. ==============================

    4.

    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!)
    
  5. from https://stackoverflow.com/questions/3049368/why-do-case-class-companion-objects-extend-functionn by cc-by-sa and MIT license