Ruby 3.5 미리보기에서는 여러 중요한 기능 업데이트와 변경 사항이 도입되었습니다. 첫째, Set 클래스가 stdlib에서 코어 클래스로 승격되었습니다. 기존에는 내부적으로 Hash를 사용하여 Ruby로 구현되었으나, 새로운 C 기반 구현은 Set 연산에 최적화된 맞춤형 해시 테이블 구조를 사용합니다. 이 변화는 대규모 Set에 대해 약 33%의 메모리 사용량 감소와 대부분의 Set 작업에서 성능 향상을 가져오며, 사용자에게는 기능적인 변경 없이 이점을 제공합니다.
둘째, Ractor에 Ractor::Port가 도입되면서 주요 업데이트가 이루어졌습니다. 이는 Ractor 간의 더 나은 동기화를 가능하게 하며, Ractor.yield, Ractor#take, Ractor.select 등 여러 기존 Ractor 메서드가 제거되었습니다. 개발자는 이제 Ractor.yield를 port.send로, ractor.take를 port.recv로 마이그레이션해야 합니다. 새로운 Ractor::Port API는 Ractor 간의 통신을 더욱 명확하고 효율적으로 만듭니다.
셋째, nil splat 연산자 동작이 단순화되어 일관성이 강화되었습니다. Ruby 3.5 이전에는 *nil
이 내부적으로 nil.to_a
를 호출하여 []
를 반환했지만, 이제는 double splat
(**nil
이 {}
를 반환하는 방식)과 같이 더욱 직접적이고 일관된 방식으로 []
를 반환합니다.
넷째, IO.select 메서드가 Float::INFINITY를 타임아웃 인수로 지원하게 되었습니다. 이는 IO가 준비될 때까지 무기한으로 대기해야 하는 경우에 유용합니다.
다섯째, Numbered Parameters(_1
, _2
등)가 더 이상 binding 인트로스펙션에 포함되지 않습니다. 이는 Numbered Parameters를 진정으로 익명으로 만들며, Ruby 3.4에서 도입된 it
파라미터로의 마이그레이션이 권장됩니다.
여섯째, Kernel#inspect가 instance_variables_to_inspect를 통해 사용자 정의를 지원합니다. 이를 통해 개발자는 inspect 출력에 표시할 인스턴스 변수를 선택적으로 제어하여 민감한 정보를 숨길 수 있습니다.
일곱째, Socket.tcp에 open_timeout 키워드 인수가 추가되어 연결 시도에 대한 타임아웃을 설정할 수 있게 되었습니다.
마지막으로, 기본 Gem들이 업데이트되었으며, ostruct
, pstore
, benchmark
, logger
등이 최신 버전으로 번들 제공됩니다. 또한, CGI 라이브러리의 대부분이 제거되고 escape/unescape
메서드만 남았으며, SortedSet은 더 이상 require ‘set’ 시 자동 로드되지 않습니다. 이 두 가지 변경 사항은 해당 기능을 사용하는 애플리케이션에서 명시적인 gem 추가(cgi, sorted_set)를 요구합니다.