복붙노트

[SCALA] 스칼라 : 목록 대 무기 호 ()

SCALA

스칼라 : 목록 대 무기 호 ()

스칼라에서 무기 호 및 목록 () 사이에 전혀 차이가 있습니까?

하나 더 관용적 스칼라 스타일이다, 그렇지 않다면? 모두 빈 목록에 새로운 빈 목록 및 패턴 매칭을 만들기위한.

해결법

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

    1.

    scala> println (Nil == List())
    true
    
    scala> println (Nil eq List())
    true
    
    scala> println (Nil equals List())
    true
    
    scala> System.identityHashCode(Nil)
    374527572
    
    scala> System.identityHashCode(List())
    374527572
    

    무기 호는 더 관용적이며, 대부분의 경우에 선호 될 수있다. 질문이 있으십니까?

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

    2.사용자 알려지지는 무기 호 및 목록 () 모두의 런타임 값이 동일하다는 것을 보여 주었다. 그러나, 그들의 정적 유형은되지 않습니다 :

    사용자 알려지지는 무기 호 및 목록 () 모두의 런타임 값이 동일하다는 것을 보여 주었다. 그러나, 그들의 정적 유형은되지 않습니다 :

    scala> val x = List()
    x: List[Nothing] = List()
    
    scala> val y = Nil
    y: scala.collection.immutable.Nil.type = List()
    
    scala> def cmpTypes[A, B](a: A, b: B)(implicit ev: A =:= B = null) = if (ev eq null) false else true
    cmpTypes: [A, B](a: A, b: B)(implicit ev: =:=[A,B])Boolean
    
    scala> cmpTypes(x, y)
    res0: Boolean = false
    
    scala> cmpTypes(x, x)
    res1: Boolean = true
    
    scala> cmpTypes(y, y)
    res2: Boolean = true
    

    이 같은 배의 누적 같이 유형을 추론하는 데 사용되는 경우에 특히 중요하다 :

    scala> List(1, 2, 3).foldLeft(List[Int]())((x, y) => y :: x)
    res6: List[Int] = List(3, 2, 1)
    
    scala> List(1, 2, 3).foldLeft(Nil)((x, y) => y :: x)
    <console>:10: error: type mismatch;
     found   : List[Int]
     required: scala.collection.immutable.Nil.type
           List(1, 2, 3).foldLeft(Nil)((x, y) => y :: x)
                                                   ^
    
  3. ==============================

    3.사용자 불명의 대답 쇼, 그들은 동일한 개체입니다.

    사용자 불명의 대답 쇼, 그들은 동일한 개체입니다.

    그것은 좋은 짧기 때문에 관용구 무기 호 선호한다. 하지만 예외가있다 : 명시 적 유형이 내가 생각하는 어떤 이유에서 필요한 경우

    List[Foo]() 
    

    보다 좋네요

    Nil : List[Foo]
    
  4. from https://stackoverflow.com/questions/5981850/scala-nil-vs-list by cc-by-sa and MIT license