Ruby 3 주의사항
Ruby 3 지원 작업 중 발견된 미묘한 버그와 테스트 실패를 유발하는 언어 변경 사항을 설명합니다.
이 섹션에서는 Ruby 3 지원 작업 중 발견된 여러 문제를 설명합니다. 이 문제들은 이해하기 어려운 미묘한 버그나 테스트 실패를 유발했습니다. Ruby 코드를 정기적으로 작성하는 모든 GitLab 기여자가 이 이슈들을 숙지하기를 권장합니다. Ruby 3 언어 및 표준 라이브러리의 전체 변경 사항 목록은 Ruby Changes 를 참조하세요. Hash#each 가 람다에 2-요소 배열을 일관되게 yield함 # 다음 코드 스니펫을 살펴보세요: def foo(a, b) p [a, b] end def bar(a, b = 2) p [a, b] end foo_lambda = method(:foo).to_proc bar_lambda = method(:bar).to_proc { a: 1 }.each(&foo_lambda) { a: 1 }.each(&bar_lambda) Ruby 2.7에서 이 프로그램의 출력은 해시 항목을 람다에 yield하는 동작이 필수 인수의 수에 따라 다르게 동작함을 보여줍니다: # Ruby 2.7 { a: 1 }.each(&foo_lambda) # prints [:a, 1] { a: 1 }.each(&bar_lambda) # prints [[:a, 1], 2] Ruby 3은 이 동작을 일관되게 만들어 항상 해시 항목을 단일 [key, value] 배열로 yield하려 시도합니다: # Ruby 3.0 { a: 1 }.each(&foo_lambda) # `foo': wrong number of arguments (given 1, expected 2) (ArgumentError) { a: 1 }.each(&bar_lambda) # prints [[:a, 1], 2] 2.7과 3.0 모두에서 동작하는 코드를 작성하려면 다음 옵션들을 고려하세요: 항상 람다 본문을 블록으로 전달합니다: { a: 1 }.each { |a, b| p [a, b] } . 람다 인수를 분해합니다: { a: 1 }.each(&->((a, b)) { p [a, b] }) . 블록을 명시적으로 전달하고 블록 파라미터로 두 개의 필수 인수를 사용하는 방식을 권장합니다. 자세한 내용은 Ruby 이슈 12706 을 참조하세요. Symbol#to_proc 이 람다와 일관된 시그니처 메타데이터를 반환함 # Ruby에서 흔히 사용되는 관용구는 &:<symbol> 단축 표현을 사용해 Proc 객체를 얻고 고차 함수에 전달하는 것입니다: [1, 2, 3].each(&:to_s) Ruby는 &:<symbol> 을 Symbol#to_proc 으로 변환합니다. 이를 메서드 수신자 를 첫 번째 인수(여기서는 Integer )로, 모든 메서드 인수 (여기서는 없음)를 나머지 인수로 해서 호출할 수 있습니다. 이 동작은 Ruby 2.7과 Ruby 3에서 동일합니다. Ruby 3이 다른 점은 이 Proc 객체를 캡처하고 호출 시그니처를 검사할 때입니다. 이는 DSL을 작성하거나 다른