openlang

ruby delete가 예상과 다르게 동작하나요?

정수 배열을 바꾸는데 ruby 2.6.1p33 (2019-01-30 revision 66950) [x86_64-darwin13] 환경에서 예상과 다른 결과가 나옵니다 :

values = [
  2, 134, 163, 215, 108
]
=> [2, 134, 163, 215, 108]
target = 108
=> 108
values.delete(target)
=> 108

쓰는 방식을 조금씩 바꿔 봐도 계속 같은 결과가 나옵니다.

제가 잘못 쓰고 있는 건가요, 다른 명령이 이 동작을 덮어쓰는 건가요, 아니면 더 나쁘게 뭔가 손상된 걸까요? 확신이 없는데 어떻게 확인할 수 있을까요?

영어에서 번역원문 보기

이어지는 대화 2

서로의 근거를 따라
  1. 고유 링크

    Array#delete (https://ruby-doc.org/core-3.0.0/Array.html#method-i-delete) 문서에 따르면:

    블록을 주지 않으면 self에서 다음 조건을 만족하는 모든 ele을 삭제하고 ele == obj; 마지막으로 삭제한 요소를 반환합니다...

    여기서 target에는 108이 들어 있으므로 변수를 대입할 때 그 값이 표시됩니다. 이어서 values.delete(target)는 values 안에서 일치하는 요소를 찾아 삭제하고 target에 들어 있는 값을 돌려줍니다.

    영어에서 번역원문 보기
  2. 고유 링크

    이 코드를 실행하면 어떤 결과가 나올 거라고 생각하셨나요? 올려 주신 예제는 정상적으로 동작하는 것으로 보입니다.

    예제를 실행한 직후 values의 내용을 살펴보세요 - 마지막 요소가 없어졌을 겁니다.

    Ruby의 delete() 정의가 조금 의외일 수 있습니다. 원래 배열을 그대로 두고 변경한 복사본을 반환해서 다음처럼 연결할 수 있으리라고 생각할 만합니다:

    values.delete(target).delete(163)

    그리고 배열 자체를 바꾸는 별도의 느낌표 형태가 있을 것 같죠:

    values.delete!(target)

    하지만 이 메서드는 그렇게 동작하지 않습니다. 일반 delete()를 호출하면 수신 배열을 직접 바꿉니다.

    영어에서 번역원문 보기

같은 질문의 다른 갈래

  1. Godot 3.3의 GDScript에서 일일이 나열하지 않고 enum 항목을 무작위로 고르기?

    GDScript에서 enum을 이렇게 선언했어요: 가능한 모든 변형을 나열하지 않고 enum 변형을 무작위로 고르고 싶어요. 나중에 변형을 더 추가해도 무작위로 선택하는 코드를 수정하지 않도록요. 이런 방법을 시도해 봤어요:…

    답글 2최근 활동 gdscript
  2. Nim 나머지 연산 문법

    Nim에서는 나머지를 어떻게 표현하나요? cell % 7 == 0를 쓰면 undeclared identifier: '%'가 나옵니다 Google로 검색해도 SO를 찾아봐도 답을 찾지 못했습니다.

    답글 2최근 활동 nim
  3. APL 함수에서 결과 반환하기

    함수 실행이 끝나면 어떤 값을 반환하게 하려면 어떻게 하나요? 예를 들어 이런 것이 있습니다: ROUTINE N ? N ⍴ 12 //이것은 1부터 12까지의 난수 N개를 만듭니다 (N은 함수의 인수입니다). 함수의 결과를 돌…

    답글 2최근 활동 apl