2016-09-23 3 views
1

저는 기본적인 루비를 연습 할 수 있도록 게임을 만들고 있습니다. 내 블랙 잭 게임에서, 나는 뽑을 카드 ​​덱을 만들었습니다.Ruby 메서드가 원래 배열을 변형시키지 않는 이유는 무엇입니까?

player_cards = cards.shuffle!.shift(2) 

나는 변화를 사용과 같이 셔플과 함께 팝업을 시도 : 나는 배열을 섞어 관리했습니다 유일한 방법은, 그 배열에서 끌어 다음과 같이 배열은 원래 카드에서 두 개의 카드를 제거 : 내가 셔플없이 팝과 변화를 사용하는 경우

player_cards = cards.shuffle.shift 
player_cards = cards.shuffle.pop 

IRB에서, 배열 내가 (해시의 배열)에서 당겨 노력하고있어 갑판에서 그 카드를 제거합니다. 셔플을 추가하자 마자 카드는 더 이상 영구적으로 덱에서 제거되지 않습니다. 나는 셔플을 사용해야한다! 내 작업을 완료하기 위해서.

내가 알고 싶은 것은 왜 셔플을 사용하여 예상대로 작업을 시작하지 않습니까? Ruby에서 chaining에 대한 기초적인 이해는 카드 배열을 먼저 섞어서 반환 한 다음 배열의 요소를 제거한다는 것입니다.

내 오류가 무엇입니까 내 유일한 생각은 셔플 배열을 셔플 및 셔플 된 배열을 반환하지만 원래 카드 배열을 반환합니다. 셔플 된 배열에서 하나 또는 두 개의 카드를 띄우거나 이동 시키면 원래의 카드 배열이 아니라 셔플에 의해 반환 된 배열입니다. 그 맞습니까?

+0

죄송합니다. 문제를 이해할 수 없습니다. 그걸 가르쳐 줄 수 있니? – Aleksey

+0

@Aleksey 문제가 분명하게 명시되어 있지만, 더 많은 것을 명확히 할 이유가 없습니다. – mudasobwa

+1

죄송합니다. 오늘은 좀 아플 것 같습니다. 그 때문일 수도 있습니다. – Aleksey

답변

1

cards.shufflecards.shuffle! 사이에 상당한 차이가있다 (오입 버전).

전자 새로운 배열을 생성하고, 후자의 는 원래을 변이합니다. 에서 말했다

, 당신의 후자 코드 shift들과 popshuffle에 의해 생성 된 원래 배열의 복사합니다.

+0

그게 문제라고 생각했는데, 100 % 확신하지 못했습니다. 거기에 훌륭한 Stackoverflow 질문에 대한 루비 메서드 및 어떻게 내가 위에서 일을 같이 체인 때 함께 작동합니까? 연쇄 과정에 대한 자세한 내용을 알고 있다면 향후 문제를 해결하는 데 도움이됩니다. –

+0

나는 SO 질문에 대해 확신하지 못하지만 체인 방법은 다른 것을 연결하는 것처럼 간단합니다. 메서드는 입력을 받아 값을 반환합니다. 쇠사슬에 묶여있을 때, 다음 메소드는 리턴 된 것을 호출합니다. 간단합니다. ''a'.ord.to_s.split ('')'을 고려하십시오. ''97.to_s'는''97 "'⇒''97 '을 반환합니다 .split (' ')''"9 ","7 "]'등을 반환합니다. 혼란스러워, 원래의 개체의 돌연변이입니다. 일반적으로 호의적 인 규칙이 있습니다 : 메소드가 수신자를 변형 시키면 이름에 '!'이 붙습니다. 그렇지 않으면 메소드가 새 인스턴스를 생성합니다. 희망이 도움이됩니다. – mudasobwa

관련 문제