2010-06-16 2 views
1

나는 종종 Enumerable에서 subpart를 꺼내기를 원합니다. subpart는 때로는 원래 Enumerable 인스턴스의 시작과 끝 부분에 있으며 때로는 subpart를 지정하는 데 사용되는 길이가 때로는 subpart의 경우와 때로는 그 보완 요소입니다. 그것은 네 가지 가능성을 제공하지만, 나는 세 가지 방법 만 알고 있습니다. 네 번째 방법은 있습니까?Enumerable에서 subpart 가져 오기

1 ) 도착 제 n 요소 :

[1, 2, 3, 4, 5].first(3) # => [1, 2, 3] or 
[1, 2, 3, 4, 5].take(3) # => [1, 2, 3] 

2) 삭제 제 n 요소 :

[1, 2, 3, 4, 5].drop(3) #=> [4, 5] 

3) 도착 마지막 n 요소 :

[1, 2, 3, 4, 5].last(3) #=> [3, 4, 5] 

4) 마지막으로 떨어지는,393,210 요소 :

[1, 2, 3, 4, 5].some_method(3) #=> [1, 2] 
+1

내가 아는 한. 나는 실제로 그 두어 시간을 필요로했다. 나는 reverse.drop (n) .reverse에 의지했다. 그것은 역경과 시간 모두에서 끔찍한 결과를 낸다. –

+0

@ Jörg, 나는 단지 "irb"에서 놀고 있었고, "나는 reverse.drop.reverse'에 머물러 있지 않을 것입니다." 나는 우리가 붙어있는 것 같아요. 나는'array [0 .. (array.size - (n + 1))] '이 너무 추한 것 같지 않습니까? – Telemachus

+0

@Telemachus : 내 대답과 마찬가지로 음의 상한선을 사용할 수 있습니다. –

답변

2

가 정확히이 일을 더 내장 방법은 없습니다, 그러나 부정적인 인덱스 slice를 사용하기 쉽습니다 :

[1, 2, 3, 4, 5][0...-3] # => [1, 2] 

당신은 당신이 그렇게 할 경우 자신의 롤 수 자주 :

class Array 
    def rdrop(n) 
    self[0...-n] 
    end 
end 

[1, 2, 3, 4, 5].rdrop(3) # => [1, 2] 

: lastEnumerable의 방법은 아닙니다; 유일한 방법은 rdrop 일 수 배열을 처음으로 구축하는 것입니다 (Enumerable#sort처럼) ...

+0

아주 예쁘다. 네거티브 슬라이스를 생각했지만 독점적 인 슬라이스는 '...'을 깜빡입니다. 그게 제가 음수로 만들기 전에 숫자에 *를 더하게 만들었고, 모두 다시 못 생겼습니다. – Telemachus

+0

제안 및 메모 주셔서 감사합니다. 나는 독점적 인 조각에 대해서도 잊었다. – sawa