2010-04-23 7 views
16
scala> val a = Array [Double] (10) 
a: Array[Double] = Array(10.0) 

scala> val a = new Array [Double] (10) 
a: Array[Double] = Array(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0) 

왜이 두 표현식에는 다른 의미가 있습니까?스칼라 배열 생성자?

+0

스칼라에서 관리하는 어레이는 해충입니다. 고정 된베이스에서 개발하는 경우에만 가능합니다. – sub

+3

"고정 된베이스?" 사실 어레이 치료가 2.7에서 2.8로 크게 바뀌었지만 앞으로도 안정적으로 유지 될 것으로 기대합니다. 이제 스칼라 배열은 자바 배열입니다. 스칼라의 "추가"배열 기능은 암시를 통해 처리됩니다. –

+0

implict를 사용하면 Array가 더 많은 기능을 사용할 수 있습니까? –

답변

42

다소 혼란 스럽지만 스칼라는 기본적으로 클래스의 싱글 인스턴스는 인스턴스를 생성 할 수 있습니다 클래스객체의 개념을 가지고있다. 컴패니언 클래스이라는 개념이 있으며, 클래스와 동일한 이름의 오브젝트 쌍입니다. 이 메커니즘을 사용하면 "클래스"는 본질적으로 정적 메서드를 가질 수 있습니다. 스칼라에서는 그렇지 않습니다.

Array클래스 및 동반자 객체 모두 있습니다. 또한, Array objectapply 방법을 갖는다. applyArray(arg)으로 개체를 만들 수 있음을 의미합니다. 그러나 Array은 컴패니언 클래스이므로 더 일반적인 메커니즘 인 new Array(arg)을 통해 호출 할 수있는 생성자도 있습니다.

Array 개체의 apply 개체가 Array 생성자와 다른 의미를 갖고 있다는 점이 문제입니다. apply 메서드는 지정된 객체에서 배열을 만듭니다. 따라서 Array(1,2,3)1, 23과 같은 객체로 구성된 배열을 반환합니다. 한편, 생성자는 배열 차원의 크기를 지정하는 인수를 사용하여 (다차원 배열을 만들 수 있도록) 모든 슬롯을 기본값으로 초기화합니다. 그래서, 기본적

:

  • val a = Array [Double] (10)는 주어진 객체를 포함한 새로운 배열을 만드는 Array객체, apply의 메소드를 호출한다.
  • val a = new Array [Double] (10)Array 생성자를 호출합니다.이 생성자는 기본값이 0.0으로 초기화 된 10 개의 슬롯을 가진 새로운 배열을 만듭니다.
+0

좋은 답변입니다. 감사! –

+0

@mipadi, 10 개의 슬롯과 1을 기본값으로 사용하여 새 배열을 만드는 방법은 무엇입니까? 감사합니다 – city

+0

@city'val a = Array.fill (10) {1}' –

10

new Array[Double](10)은 Java에서 new double[10]과 동등한 것으로 가정됩니다.

그러나 Scala는 컬렉션 클래스에 해당하는 단일 항목에 편리한 메서드를 제공하며 Array도 예외는 아닙니다.

따라서 List(1,2,3,4,5)이라고 말하면 Array(1,2,3,4,5)이라고 말할 수도 있습니다. 그리고 당신은 할 수 있습니다.

그러나 단어가 new인지 아닌지에 따라 다소 다른 결과를 나타내는 것은 다소 어색한 입장입니다. 경쟁적인 관심사를 감안할 때 전반적으로 가장 좋은 솔루션이라고 생각합니다.하지만 조금 익숙해 져야합니다.