2013-09-06 2 views
4

Array에서 tail을 호출했지만 경고가 표시되었습니다. Array에 대한안전하게 테일 배열 가져 오기

scala> val arr = Array(1,2) 
arr: Array[Int] = Array(1, 2) 

scala> arr tail 
warning: there were 1 feature warning(s); re-run with -feature for details 
res3: Array[Int] = Array(2) 

Scaladocs는 UnsupportedOperationException [will be thrown] if the mutable indexed sequence is empty.

이 있습니까 보여줍니다 안전하고, 배열의 꼬리를 얻을 수있는 방법을 예외를 throw하지 않습니다?

답변

5

우선 경고는 안전하지 않은 방법을 사용한다는 사실과 관련이 없습니다.

scala> arr tail 
<console>:9: warning: postfix operator tail should be enabled 
by making the implicit value language.postfixOps visible... 

그리고 다음과 같은 메모를 포함 scala.language.postfixOps에 대한 the documentation에 대한 포인터 :

후위 연산자 세미콜론 추론과 제대로 상호 작용이 -feature으로 REPL을 다시 시작하면 다음과 같은 볼 수 있습니다. 대부분의 프로그래머는 이러한 이유로 피할 수 있습니다.

이것은 좋은 조언입니다. arr.tail 대신 arr tail을 쓸 수 있다는 것은 소란스러운 가치가 없습니다.

이제 안전 문제에 대해 알아보십시오. 표준 라이브러리는 컬렉션에 대한 tailOption 제공하지 않습니다,하지만 당신은 headOptionmap 사용하여 동일한 효과를 얻을 수 있습니다 :이 당신을 위해 너무 자세한 불투명 또는 비효율적 인 경우

scala> val arr = Array(1, 2) 
arr: Array[Int] = Array(1, 2) 

scala> arr.headOption.map(_ => arr.tail) 
res0: Option[Array[Int]] = Some([[email protected]) 

을 쉽게 암시 클래스를 만들 수 있습니다 tailOptionArray (또는 Seq 또는 IndexedSeq 등)에 더 좋게 추가합니다.

+2

. 그들이 무엇을 숨기고 있습니까? –

+1

@ChristopherMartin : 동의! 그리고 그 동안 우리는 '꼬리'와 같은 안전하지 않은 방법에 대한 경고를 원할 수있었습니다. –

+0

@TravisBrown 약한 예외를 확인 했습니까? – ziggystar

12

배열의 꼬리를 얻는 방법은 예외입니까? 예외는 없습니다.

당신은 drop 사용할 수 있습니다

scala> Array(1, 2, 3).drop(1) 
res0: Array[Int] = Array(2, 3) 

scala> Array[Int]().drop(1) 
res1: Array[Int] = Array() 

은 또한 아래의 코멘트에 @TravisBrown에서 언급 한 바와 같이, drop는 (하나 개의 요소 모음) 하늘의 꼬리와 부재의 구분하지 않습니다 tail (빈 콜렉션의 경우)이므로 두 경우 모두 drop(1)은 빈 콜렉션을 리턴합니다.

+0

이것은 또한 'Array (1) .drop (1) sameElements Array.empty [Int] .drop (1)'과 같은 정보를 버립니다. –

+0

귀하의 요점을 보지 마십시오. Array.empty [String] sameElements Array.empty [Int]. – pedrofurla

+0

@TravisBrown 나는 또한 그것을 얻지 않는다. 설명해 주시겠습니까? –

0

경고의 이유로 @ TravisBrown의 답변을 참조하십시오.

개인적으로 배열의 머리에 그의 오히려 영리한지도보다는 scala.util.Try을 사용 : 정말 scalac 그냥 기본적으로 기능 경고를 활성화 텐데

scala> val arr = Array(0, 1, 2) 
arr: Array[Int] = Array(0, 1, 2) 

scala> scala.util.Try {arr.tail} foreach {t => println(t.mkString(","))} 
1,2