Ruby의 Array # shift는 무엇을합니까?


88

Ruby에서 Array 클래스의 shift 및 unshift 메서드가 수행하는 작업을 이해하는 데 어려움을 겪고 있습니다. 누가 그들이하는 일을 이해하도록 도와 줄 수 있습니까?


171
배열의 다른 쪽 끝 shift/unshift과 같다는 것을 알게되면 push/pop, 어떤 요소가 '덤프'하고 어떤 요소가 요소를 '삽입'하는지 기억하기 위해 메소드 이름에서 'f'를 정신적으로 삭제할 수 있습니다. :)
Phrogz 2011 년

1
실제로 도움이되는 감사합니다.
agentbanks217 2011 년

최고의 댓글 중 하나! :) 감사합니다 당신이 너무 많은
tvdeyen

18
@Phrogz 실제로 척추 동물의 소화 시스템은 스택보다 대기열로 모델링하는 것이 더 좋습니다.
Jian 2013 년

8
@Jian :) 오른쪽 : push상단에, shift반대쪽 끝으로.
Phrogz 2013 년

답변:


98

상기 찾고 루비 문서

Array.shift는 배열에서 첫 번째 요소를 제거하고이를 반환합니다.

a = [1,2,3] 
puts a.shift
 => 1 
puts a
 => [2, 3] 

Unshift는 제공된 값을 배열 앞에 추가하여 다른 모든 요소를 ​​위로 이동합니다.

a=%w[b c d]
 => ["b", "c", "d"] 
a.unshift("a")
 => ["a", "b", "c", "d"] 

8
당신은 기본적으로 FIFO 큐에 작업을 것으로 변화 및 취소]를 생각할 수
자코 프리 토 리우스을

@JacoPretorius 응? shiftunshiftFILO 스택처럼 행동 push하고 shift내가 뭔가에 대해 혼란 스러워요하지 않는 한 FIFO 큐처럼 행동한다.
Greg Schmit

@GregSchmit 아, 맞아. 아니면 실제로 LIFO 대기열 이지요?
Jaco Pretorius

@JacoPretorius 글쎄 저는 LIFO == FILO라고 생각합니다 (선입 선출은 패턴이 유지되면 마지막 입력이 먼저 나와야 함을 의미합니다).
Greg Schmit

@JacoPretorius LIFO와 FILO는 모두 "스택처럼 동작"을 의미합니다.
Greg Schmit

52

shiftunshift유사한 방식으로 작동 pop하고 push: 그들은 당신이 추가 할 수있는에 스택 및 제거 요소 (시간당 보통 하나)로 사용 배열에 의미가있다. 차이점은 단지이다 shiftunshift의 시작 / 제거 요소를 추가 Array실제로 시프트를 다른 모든 요소를 보내고, 반면 poppush의 끝에 / 제거 요소를 추가 Array하므로 다른 요소의 인덱스를 유지.

예 :

                      # Spacing for clarity:
a = [2, 4, 8]    # a =>       [2, 4, 8]
a.push(16, 32)   # a =>       [2, 4, 8, 16, 32]
a.unshift(0, 1)  # a => [0, 1, 2, 4, 8, 16, 32]
a.shift          # a =>    [1, 2, 4, 8, 16, 32]
a.pop            # a =>    [1, 2, 4, 8, 16]

mipadi 스레드를 요약하기 위해 답변을 편집했다면 기꺼이 찬성 할 것입니다.
Steven Sudit

멋있는. 또한 Ruby에 대해 잘 모르지만 JVM에서 실행되는 경우 모든 요소를 ​​이동할 필요가 없기 때문에 푸시 / 팝이 더 빠를 것으로 기대합니다.
Steven Sudit

스택 비유를 위해 찬성표를 던지지 만 파이프도 생각하십시오. 우리는 프로그래머가되어야하므로 시프트는 왼쪽으로 시프트하고 언 시프트는 수평 왼쪽에서 오른쪽으로 배열하는 오른쪽 시프트라고 생각해야합니다.
mckenzm

8

첫 번째 요소를 잡고 배열에서 제거하고 제거 된 요소를 반환합니다. 기본적으로 배열을 스택처럼 처리하는 방법 shift입니다. 팝, unshift푸시입니다.


8
Well shift 및 unshift는 pop 및 push 와 유사하지만 배열의 시작 부분에서 항목을 추가하고 제거하는 대신 끝에서 제거합니다.
Alberto Santini

2
이 대답은 정확한 추상화 수준입니다.
Steven Sudit

@Alberto : 또는 다시 말해서, 그들은 정면이 정상이라고 생각합니다. 그렇지 않다는 요구 사항은 없습니다.
Steven Sudit

5
난 그냥 이후 지적했다 poppush또한 Array방법, 혼란을 만들 수 없습니다. :-)
Alberto Santini

3
@Alberto : 실제로 좋은 지적입니다. 시프트 / 언 시프트 방법은 전면을 상단으로 사용하는 반면 푸시 / 팝 방법은 끝을 상단으로 사용합니다. 둘 다 어레이를 스택으로 취급하며 사용하는 끝만 다릅니다.
Steven Sudit

2

배열을 처리 할 값의 대기열과 같은 것으로 생각할 수 있다면 다음 (앞) 값을 가져 와서 다른 값을 "이동"하여 사용 가능한 공간을 차지할 수 있습니다. unshift는 값을 다시 넣습니다. 아마도 여러분은 그것들 중 일부를 처리 할 준비가되지 않았거나 나중에 코드가 그것들을 처리하도록 할 것입니다.


1

배열의 첫 번째 요소를 반환하고 배열에서 제거 하여 요소를 한 위치 뒤로 이동 합니다.

그래서 이동 [1,2,3,4,5]

을 반환 1하고 배열을로 설정합니다 [2,3,4,5].

여기 더 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.