From 681fd87337305852817f644bf889c9270f33debc Mon Sep 17 00:00:00 2001 From: "Yonghyun Kim (Freddy)" Date: Sun, 21 Dec 2025 22:08:17 +0900 Subject: [PATCH 1/2] Translate "Ruby 4.0.0 preview3 Released" (ko) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit πŸ€– Generated with [Claude Code](https://claude.com/claude-code) --- ...2025-12-18-ruby-4-0-0-preview3-released.md | 491 ++++++++++++++++++ 1 file changed, 491 insertions(+) create mode 100644 ko/news/_posts/2025-12-18-ruby-4-0-0-preview3-released.md diff --git a/ko/news/_posts/2025-12-18-ruby-4-0-0-preview3-released.md b/ko/news/_posts/2025-12-18-ruby-4-0-0-preview3-released.md new file mode 100644 index 0000000000..2debeb9388 --- /dev/null +++ b/ko/news/_posts/2025-12-18-ruby-4-0-0-preview3-released.md @@ -0,0 +1,491 @@ +--- +layout: news_post +title: "Ruby 4.0.0 preview3 릴리슀" +author: "naruse" +translator: "Yonghyun Kim" +date: 2025-12-18 00:00:00 +0000 +lang: ko +--- + +{% assign release = site.data.releases | where: "version", "4.0.0-preview3" | first %} +Ruby {{ release.version }} 릴리슀λ₯Ό μ•Œλ¦¬κ²Œ λ˜μ–΄ κΈ°μ©λ‹ˆλ‹€. +Ruby 4.0은 Ruby::Box와 "ZJIT"λ₯Ό λ„μž…ν•˜κ³ , λ§Žμ€ κ°œμ„ μ„ μΆ”κ°€ν•©λ‹ˆλ‹€. + +## Ruby::Box + +μ •μ˜μ— λŒ€ν•œ 뢄리λ₯Ό μ œκ³΅ν•˜λŠ” μƒˆλ‘œμš΄ (μ‹€ν—˜μ ) κΈ°λŠ₯μž…λ‹ˆλ‹€. +"Ruby Box"에 λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ [doc/language/box.md](https://github.com/ruby/ruby/blob/master/doc/language/box.md)λ₯Ό μ°Έμ‘°ν•˜μ„Έμš”. +[[Feature #21311]] [[Misc #21385]] + +## μ–Έμ–΄ λ³€κ²½ + +* `**nil`이 `nil.to_hash`λ₯Ό ν˜ΈμΆœν•˜μ§€ μ•ŠλŠ” 것과 λ§ˆμ°¬κ°€μ§€λ‘œ, `*nil`은 더 이상 + `nil.to_a`λ₯Ό ν˜ΈμΆœν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. [[Feature #21047]] + +* 쀄 μ‹œμž‘ 뢀뢄에 μžˆλŠ” 논리 이항 μ—°μ‚°μž(`||`, `&&`, `and`, `or`)λŠ” + μœ μ—°ν•œ 점(fluent dot)처럼 이전 쀄을 μ΄μ–΄κ°‘λ‹ˆλ‹€. + λ‹€μŒ 두 μ½”λ“œλŠ” λ™μΌν•©λ‹ˆλ‹€. + + ```ruby + if condition1 + && condition2 + ... + end + ``` + + ```ruby + if condition1 && condition2 + ... + end + ``` + + [[Feature #20925]] + +## μ½”μ–΄ 클래슀 λ³€κ²½ + +주의: μ£Όλͺ©ν• λ§Œν•œ 클래슀 λ³€κ²½λ§Œμ„ ν¬ν•¨ν•©λ‹ˆλ‹€. + +* Kernel + + * `Kernel#inspect`λŠ” 이제 `#instance_variables_to_inspect` λ©”μ„œλ“œμ˜ 쑴재 μ—¬λΆ€λ₯Ό ν™•μΈν•˜μ—¬, + `#inspect` λ¬Έμžμ—΄μ— ν‘œμ‹œλ˜λŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό μ œμ–΄ν•  수 μžˆμŠ΅λ‹ˆλ‹€. + + ```ruby + class DatabaseConfig + def initialize(host, user, password) + @host = host + @user = user + @password = password + end + + private def instance_variables_to_inspect = [:@host, :@user] + end + + conf = DatabaseConfig.new("localhost", "root", "hunter2") + conf.inspect #=> # + ``` + + [[Feature #21219]] + + * Deprecate λ˜μ—ˆλ˜, μ„ ν–‰ `|`λ₯Ό μ‚¬μš©ν•œ `Kernel#open`의 ν”„λ‘œμ„ΈμŠ€ 생성 κΈ°λŠ₯이 μ œκ±°λ˜μ—ˆμŠ΅λ‹ˆλ‹€. + [[Feature #19630]] + +* Binding + + * `Binding#local_variables`λŠ” 더 이상 λ²ˆν˜Έκ°€ 맀겨진 λ§€κ°œλ³€μˆ˜λ₯Ό ν¬ν•¨ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. + λ˜ν•œ, `Binding#local_variable_get`κ³Ό `Binding#local_variable_set`은 λ²ˆν˜Έκ°€ 맀겨진 λ§€κ°œλ³€μˆ˜λ₯Ό + μ²˜λ¦¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. [[Bug #21049]] + +* File + + * `File::Stat#birthtime`이 컀널과 νŒŒμΌμ‹œμŠ€ν…œμ—μ„œ μ§€μ›λ˜λŠ” 경우 statx μ‹œμŠ€ν…œ μ½œμ„ 톡해 + Linuxμ—μ„œ μ‚¬μš© κ°€λŠ₯ν•©λ‹ˆλ‹€. [[Feature #21205]] + +* IO + + * `IO.select`λŠ” νƒ€μž„μ•„μ›ƒ 인자둜 `Float::INFINITY`λ₯Ό ν—ˆμš©ν•©λ‹ˆλ‹€. + [[Feature #20610]] + + * Deprecate λ˜μ—ˆλ˜, μ„ ν–‰ `|`λ₯Ό μ‚¬μš©ν•œ `IO` 클래슀 λ©”μ„œλ“œμ˜ ν”„λ‘œμ„ΈμŠ€ 생성 κΈ°λŠ₯이 μ œκ±°λ˜μ—ˆμŠ΅λ‹ˆλ‹€. + [[Feature #19630]] + +* Math + + * `Math.log1p`와 `Math.expm1`이 μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€. [[Feature #21527]] + +* Method + + * `Method#source_location`, `Proc#source_location`, `UnboundMethod#source_location`은 + 이제 5개의 μš”μ†Œλ₯Ό κ°€μ§„ ν™•μž₯된 μœ„μΉ˜ 정보λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€: `[path, start_line, start_column, + end_line, end_column]`. μ΄μ „μ˜ 2개 μš”μ†Œ ν˜•μ‹ `[path, line]`은 결과에 `.take(2)`λ₯Ό + ν˜ΈμΆœν•˜μ—¬ 얻을 수 μžˆμŠ΅λ‹ˆλ‹€. [[Feature #6012]] + +* Proc + + * `Proc#parameters`λŠ” 이제 읡λͺ… 선택적 λ§€κ°œλ³€μˆ˜λ₯Ό `[:opt, nil]` λŒ€μ‹  `[:opt]`둜 ν‘œμ‹œν•˜μ—¬, + 읡λͺ… λ§€κ°œλ³€μˆ˜κ°€ ν•„μˆ˜μΈ κ²½μš°μ™€ μΌκ΄€λœ 좜λ ₯을 μ œκ³΅ν•©λ‹ˆλ‹€. [[Bug #20974]] + +* Ractor + + * Ractor κ°„ 톡신을 μœ„ν•œ μƒˆλ‘œμš΄ 동기화 λ©”μ»€λ‹ˆμ¦˜μœΌλ‘œ `Ractor::Port` ν΄λž˜μŠ€κ°€ μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€. + [[Feature #21262]] + + ```ruby + port1 = Ractor::Port.new + port2 = Ractor::Port.new + Ractor.new port1, port2 do |port1, port2| + port1 << 1 + port2 << 11 + port1 << 2 + port2 << 12 + end + 2.times{ p port1.receive } #=> 1, 2 + 2.times{ p port2.receive } #=> 11, 12 + ``` + + `Ractor::Port`λŠ” λ‹€μŒ λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. + + * `Ractor::Port#receive` + * `Ractor::Port#send` (λ˜λŠ” `Ractor::Port#<<`) + * `Ractor::Port#close` + * `Ractor::Port#closed?` + + κ·Έ κ²°κ³Ό, `Ractor.yield`와 `Ractor#take`κ°€ μ œκ±°λ˜μ—ˆμŠ΅λ‹ˆλ‹€. + + * Ractor의 μ’…λ£Œλ₯Ό 기닀리기 μœ„ν•΄ `Ractor#join`κ³Ό `Ractor#value`κ°€ μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€. + 이듀은 `Thread#join` 및 `Thread#value`와 μœ μ‚¬ν•©λ‹ˆλ‹€. + + * `Ractor#join`을 λ‚΄λΆ€μ μœΌλ‘œ κ΅¬ν˜„ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” μ €μˆ˜μ€€ μΈν„°νŽ˜μ΄μŠ€λ‘œ + `Ractor#monitor`와 `Ractor#unmonitor`κ°€ μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€. + + * `Ractor.select`λŠ” 이제 Ractor와 Port만 ν—ˆμš©ν•©λ‹ˆλ‹€. Ractorκ°€ μ£Όμ–΄μ§€λ©΄, + Ractorκ°€ μ’…λ£Œλ  λ•Œ λ°˜ν™˜λ©λ‹ˆλ‹€. + + * `Ractor#default_port`κ°€ μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 각 `Ractor`λŠ” `Ractor.send`, `Ractor.receive`μ—μ„œ + μ‚¬μš©ν•˜λŠ” κΈ°λ³Έ 포트λ₯Ό κ°€μ§‘λ‹ˆλ‹€. + + * `Ractor#close_incoming`κ³Ό `Ractor#close_outgoing`이 μ œκ±°λ˜μ—ˆμŠ΅λ‹ˆλ‹€. + + * 곡유 κ°€λŠ₯ν•œ Proc λ˜λŠ” lambdaλ₯Ό λ§Œλ“€κΈ° μœ„ν•΄ `Ractor.shareable_proc`와 `Ractor.shareable_lambda`κ°€ + λ„μž…λ˜μ—ˆμŠ΅λ‹ˆλ‹€. [[Feature #21550]], [[Feature #21557]] + +* Range + + * `Range#to_set`κ³Ό `Enumerator#to_set`은 이제 끝이 μ—†λŠ” λ²”μœ„ 문제λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ + 크기 검사λ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€. [[Bug #21654]] + + * `Range#overlap?`은 이제 λ¬΄ν•œ(경계가 μ—†λŠ”) λ²”μœ„λ₯Ό μ˜¬λ°”λ₯΄κ²Œ μ²˜λ¦¬ν•©λ‹ˆλ‹€. + [[Bug #21185]] + + * μ‹œμž‘μ΄ μ—†λŠ” μ •μˆ˜ λ²”μœ„μ—μ„œ `Range#max` λ™μž‘μ΄ μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€. + [[Bug #21174]] [[Bug #21175]] + +* Ruby + + * Ruby κ΄€λ ¨ μƒμˆ˜λ₯Ό ν¬ν•¨ν•˜λŠ” μƒˆλ‘œμš΄ μ΅œμƒμœ„ λͺ¨λ“ˆ `Ruby`κ°€ μ •μ˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€. + 이 λͺ¨λ“ˆμ€ Ruby 3.4μ—μ„œ μ˜ˆμ•½λ˜μ—ˆμœΌλ©° 이제 κ³΅μ‹μ μœΌλ‘œ μ •μ˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€. + [[Feature #20884]] + +* Ruby::Box + + * μ •μ˜μ— λŒ€ν•œ 뢄리λ₯Ό μ œκ³΅ν•˜λŠ” μƒˆλ‘œμš΄ (μ‹€ν—˜μ ) κΈ°λŠ₯μž…λ‹ˆλ‹€. + "Ruby Box"에 λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ [doc/language/box.md](https://github.com/ruby/ruby/blob/master/doc/language/box.md)λ₯Ό μ°Έμ‘°ν•˜μ„Έμš”. + [[Feature #21311]] [[Misc #21385]] + +* Set + + * `Set`은 이제 μ½”μ–΄ 클래슀이며, 더 이상 autoloaded stdlib ν΄λž˜μŠ€κ°€ μ•„λ‹™λ‹ˆλ‹€. + [[Feature #21216]] + + * `Set#inspect`은 이제 `Set[]` ꡬ문을 μ‚¬μš©ν•˜μ—¬ `eval`에 μ ν•©ν•œ λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•©λ‹ˆλ‹€ + (예: `#` λŒ€μ‹  `Set[1, 2, 3]`). μ΄λŠ” Array, Hash와 같은 + λ‹€λ₯Έ μ½”μ–΄ μ»¬λ ‰μ…˜ ν΄λž˜μŠ€μ™€ 일관성을 μœ μ§€ν•©λ‹ˆλ‹€. [[Feature #21389]] + + * `Set#to_set`κ³Ό `Enumerable#to_set`에 인자λ₯Ό μ „λ‹¬ν•˜λŠ” 것은 deprecate λ˜μ—ˆμŠ΅λ‹ˆλ‹€. + [[Feature #21390]] + +* Socket + + * `Socket.tcp`와 `TCPSocket.new`λŠ” 초기 연결에 λŒ€ν•œ νƒ€μž„μ•„μ›ƒμ„ μ§€μ •ν•˜κΈ° μœ„ν•΄ + `open_timeout` ν‚€μ›Œλ“œ 인자λ₯Ό ν—ˆμš©ν•©λ‹ˆλ‹€. [[Feature #21347]] + +* String + + * μœ λ‹ˆμ½”λ“œ 17.0.0 및 이λͺ¨μ§€ 버전 17.0으둜 μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€. + [[Feature #19908]][[Feature #20724]][[Feature #21275]] (Regexp에도 μ μš©λ©λ‹ˆλ‹€) + + * `String#strip`, `strip!`, `lstrip`, `lstrip!`, `rstrip`, `rstrip!`이 + `*selectors` 인자λ₯Ό ν—ˆμš©ν•˜λ„λ‘ ν™•μž₯λ˜μ—ˆμŠ΅λ‹ˆλ‹€. [[Feature #21552]] + +* Thread + + * `Kernel#raise`와 μœ μ‚¬ν•œ `Thread#raise(cause:)` 인자 지원이 λ„μž…λ˜μ—ˆμŠ΅λ‹ˆλ‹€. + [[Feature #21360]] + +* Fiber + + * `Kernel#raise`와 μœ μ‚¬ν•œ `Fiber#raise(cause:)` 인자 지원이 λ„μž…λ˜μ—ˆμŠ΅λ‹ˆλ‹€. + [[Feature #21360]] + +* Fiber::Scheduler + + * μ£Όμ–΄μ§„ μ˜ˆμ™Έλ‘œ fiberλ₯Ό μΈν„°λŸ½νŠΈν•˜κΈ° μœ„ν•œ `Fiber::Scheduler#fiber_interrupt`κ°€ λ„μž…λ˜μ—ˆμŠ΅λ‹ˆλ‹€. + 초기 μ‚¬μš© μ‚¬λ‘€λŠ” IO μž‘μ—…μ΄ λ‹«νž λ•Œ λΈ”λ‘œν‚Ή IO μž‘μ—…μ„ κΈ°λ‹€λ¦¬λŠ” fiberλ₯Ό μΈν„°λŸ½νŠΈν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. + [[Feature #21166]] + +* Pathname + + * Pathname이 κΈ°λ³Έ gemμ—μ„œ Ruby의 μ½”μ–΄ 클래슀둜 μŠΉκ²©λ˜μ—ˆμŠ΅λ‹ˆλ‹€. + [[Feature #17473]] + +## ν‘œμ€€ 라이브러리 λ³€κ²½ + +λ‹€μŒ λ²ˆλ“€ gem이 κΈ°λ³Έ gemμ—μ„œ μŠΉκ²©λ˜μ—ˆμŠ΅λ‹ˆλ‹€. + +* ostruct 0.6.3 +* pstore 0.2.0 +* benchmark 0.5.0 +* logger 1.7.0 +* rdoc 6.17.0 +* win32ole 1.9.2 +* irb 1.15.3 +* reline 0.6.3 +* readline 0.0.4 +* fiddle 1.1.8 + +μ£Όλͺ©ν• λ§Œν•œ κΈ°λŠ₯ 변경인 ν‘œμ€€ 라이브러리 λ³€κ²½λ§Œμ„ λ‚˜μ—΄ν•©λ‹ˆλ‹€. + +λ‹€λ₯Έ λ³€κ²½ 사항은 μ•„λž˜ μ„Ήμ…˜μ— λ‚˜μ—΄λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. Ruby 3.3.0 이후 λ²ˆλ“€λœ λ²„μ „μ˜ +릴리슀 νžˆμŠ€ν† λ¦¬κ°€ GitHub λ¦΄λ¦¬μŠ€μ— μžˆλŠ” 경우 ν•¨κ»˜ λ‚˜μ—΄ν–ˆμŠ΅λ‹ˆλ‹€. + +λ‹€μŒ κΈ°λ³Έ gem이 μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€. + +* win32-registry 0.1.2 + +λ‹€μŒ κΈ°λ³Έ gem이 μ—…λ°μ΄νŠΈλ˜μ—ˆμŠ΅λ‹ˆλ‹€. + +* RubyGems 4.0.1 +* bundler 4.0.1 +* date 3.5.1 +* digest 3.2.1 +* english 0.8.1 +* erb 6.0.0 +* etc 1.4.6 +* fcntl 1.3.0 +* fileutils 1.8.0 +* forwardable 1.4.0 +* io-console 0.8.1 +* io-nonblock 0.3.2 +* io-wait 0.4.0.dev +* ipaddr 1.2.8 +* json 2.17.1 +* net-http 0.8.0 +* openssl 4.0.0.pre +* optparse 0.8.1 +* pp 0.6.3 +* prism 1.6.0 +* psych 5.3.0 +* resolv 0.7.0 +* stringio 3.1.9.dev +* strscan 3.1.6.dev +* timeout 0.5.0 +* uri 1.1.1 +* weakref 0.1.4 +* zlib 3.2.2 + +λ‹€μŒ λ²ˆλ“€ gem이 μ—…λ°μ΄νŠΈλ˜μ—ˆμŠ΅λ‹ˆλ‹€. + +* minitest 5.26.2 +* power_assert 3.0.1 +* rake 13.3.1 +* test-unit 3.7.3 +* rexml 3.4.4 +* net-ftp 0.3.9 +* net-imap 0.5.12 +* net-smtp 0.5.1 +* matrix 0.4.3 +* prime 0.1.4 +* rbs 3.9.5 +* typeprof 0.31.0 +* debug 1.11.0 +* base64 0.3.0 +* bigdecimal 3.3.1 +* drb 2.2.3 +* syslog 0.3.0 +* csv 3.3.5 +* repl_type_completor 0.1.12 + +## 지원 ν”Œλž«νΌ + +* Windows + + * 14.0보닀 였래된 MSVC 버전(_MSC_VER 1900) 지원이 μ€‘λ‹¨λ˜μ—ˆμŠ΅λ‹ˆλ‹€. + μ΄λŠ” Visual Studio 2015 이상이 ν•„μš”ν•¨μ„ μ˜λ―Έν•©λ‹ˆλ‹€. + +## ν˜Έν™˜μ„± 이슈 + +* `Ractor::Port` μΆ”κ°€λ‘œ 인해 λ‹€μŒ λ©”μ„œλ“œκ°€ Ractorμ—μ„œ μ œκ±°λ˜μ—ˆμŠ΅λ‹ˆλ‹€. + + * `Ractor.yield` + * `Ractor#take` + * `Ractor#close_incoming` + * `Ractor#close_outgoging` + + [[Feature #21262]] + +* `ObjectSpace._id2ref`κ°€ deprecate λ˜μ—ˆμŠ΅λ‹ˆλ‹€. [[Feature #15408]] + +* `Process::Status#&`와 `Process::Status#>>`κ°€ μ œκ±°λ˜μ—ˆμŠ΅λ‹ˆλ‹€. + Ruby 3.3μ—μ„œ deprecate 된 λ°” μžˆμŠ΅λ‹ˆλ‹€. [[Bug #19868]] + +* `rb_path_check`κ°€ μ œκ±°λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 이 ν•¨μˆ˜λŠ” Ruby 2.7μ—μ„œ 제거된 + `$SAFE` 경둜 검사에 μ‚¬μš©λ˜μ—ˆμ—ˆμœΌλ©°, 이미 deprecate λ˜μ—ˆμ—ˆμŠ΅λ‹ˆλ‹€. + [[Feature #20971]] + +## ν‘œμ€€ 라이브러리 ν˜Έν™˜μ„± 이슈 + +* CGI λΌμ΄λΈŒλŸ¬λ¦¬κ°€ κΈ°λ³Έ gemμ—μ„œ μ œκ±°λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 이제 λ‹€μŒ λ©”μ„œλ“œλ₯Ό μœ„ν•œ + `cgi/escape`만 μ œκ³΅ν•©λ‹ˆλ‹€. + + * `CGI.escape`와 `CGI.unescape` + * `CGI.escapeHTML`κ³Ό `CGI.unescapeHTML` + * `CGI.escapeURIComponent`와 `CGI.unescapeURIComponent` + * `CGI.escapeElement`와 `CGI.unescapeElement` + + [[Feature #21258]] + +* `Set`이 ν‘œμ€€ λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ μ½”μ–΄ 클래슀둜 이동함에 따라, `set/sorted_set.rb`κ°€ + μ œκ±°λ˜μ—ˆκ³ , `SortedSet`은 더 이상 autoloaded μƒμˆ˜κ°€ μ•„λ‹™λ‹ˆλ‹€. `SortedSet`을 μ‚¬μš©ν•˜λ €λ©΄ + `sorted_set` gem을 μ„€μΉ˜ν•˜κ³  `require 'sorted_set'`을 톡해 μ΄μš©ν•΄μ£Όμ„Έμš”. + [[Feature #21287]] + +## C API λ³€κ²½ + +* IO + + * `rb_thread_fd_close`κ°€ deprecate λ˜μ—ˆμœΌλ©° 이제 아무 μž‘μ—…λ„ ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. + C ν™•μž₯μ—μ„œ Ruby μ½”λ“œλ‘œ 파일 λ””μŠ€ν¬λ¦½ν„°λ₯Ό λ…ΈμΆœν•΄μ•Ό ν•˜λŠ” 경우, + `RUBY_IO_MODE_EXTERNAL`을 μ‚¬μš©ν•˜μ—¬ `IO` μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€κ³  `rb_io_close(io)`λ₯Ό μ‚¬μš©ν•˜μ—¬ + λ‹«μœΌμ„Έμš”(μ΄λ ‡κ²Œ ν•˜λ©΄ `IO` μΈμŠ€ν„΄μŠ€μ˜ λͺ¨λ“  λŒ€κΈ° 쀑인 μž‘μ—…λ„ μΈν„°λŸ½νŠΈν•˜κ³  λŒ€κΈ°ν•©λ‹ˆλ‹€). + 파일 λ””μŠ€ν¬λ¦½ν„°λ₯Ό 직접 λ‹«μœΌλ©΄ λŒ€κΈ° 쀑인 μž‘μ—…μ„ μΈν„°λŸ½νŠΈν•˜μ§€ μ•ŠμœΌλ©°, + μ •μ˜λ˜μ§€ μ•Šμ€ λ™μž‘μ΄ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‹€μ‹œ 말해, 두 개의 `IO` 객체가 + 같은 파일 λ””μŠ€ν¬λ¦½ν„°λ₯Ό κ³΅μœ ν•˜λŠ” 경우, ν•˜λ‚˜λ₯Ό 닫아도 λ‹€λ₯Έ ν•˜λ‚˜μ—λŠ” 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. + [[Feature #18455]] + +* GVL + + * `rb_thread_call_with_gvl`은 이제 GVL μœ λ¬΄μ— 관계없이 μž‘λ™ν•©λ‹ˆλ‹€. + 이λ₯Ό 톡해 gem은 `ruby_thread_has_gvl_p` 확인을 ν”Όν•  수 μžˆμŠ΅λ‹ˆλ‹€. + κ·Έλž˜λ„ GVL에 λŒ€ν•΄μ„œλŠ” μ—¬μ „νžˆ μ£Όμ˜ν•΄μ£Όμ„Έμš”. [[Feature #20750]] + +* Set + + * `Set`에 λŒ€ν•œ C APIκ°€ μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€. λ‹€μŒ λ©”μ„œλ“œκ°€ μ§€μ›λ©λ‹ˆλ‹€. + [[Feature #21459]] + + * `rb_set_foreach` + * `rb_set_new` + * `rb_set_new_capa` + * `rb_set_lookup` + * `rb_set_add` + * `rb_set_clear` + * `rb_set_delete` + * `rb_set_size` + +## κ΅¬ν˜„ κ°œμ„  + +### Ractor + +Ractorλ₯Ό 더 μ•ˆμ •μ μ΄κ³ , μ„±λŠ₯이 μ’‹κ³ , μ‚¬μš©ν•˜κΈ° μ‰½κ²Œ λ§Œλ“€κΈ° μœ„ν•΄ λ§Žμ€ μž‘μ—…μ΄ μ§„ν–‰λ˜μ—ˆμŠ΅λ‹ˆλ‹€. +μ΄λŸ¬ν•œ κ°œμ„ μœΌλ‘œ Ractor κ΅¬ν˜„μ΄ μ‹€ν—˜μ  μƒνƒœλ₯Ό λ²—μ–΄λ‚˜λŠ” 데 더 κ°€κΉŒμ›Œμ‘ŒμŠ΅λ‹ˆλ‹€. + +* μ„±λŠ₯ κ°œμ„  + * λ™κ²°λœ λ¬Έμžμ—΄κ³Ό 심볼 ν…Œμ΄λΈ”μ€ λ‚΄λΆ€μ μœΌλ‘œ 잠금 μ—†λŠ” ν•΄μ‹œ 셋을 μ‚¬μš©ν•©λ‹ˆλ‹€ + * λ©”μ„œλ“œ μΊμ‹œ μ‘°νšŒλŠ” λŒ€λΆ€λΆ„μ˜ 경우 μž κΈˆμ„ ν”Όν•©λ‹ˆλ‹€ + * 클래슀(및 geniv) μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ 접근이 더 λΉ λ₯΄κ³  μž κΈˆμ„ ν”Όν•©λ‹ˆλ‹€ + * 객체 ν• λ‹Ή 쀑 μΊμ‹œ 경합을 ν”Όν•©λ‹ˆλ‹€ + * `object_id`λŠ” λŒ€λΆ€λΆ„μ˜ 경우 μž κΈˆμ„ ν”Όν•©λ‹ˆλ‹€ +* 버그 μˆ˜μ • 및 μ•ˆμ •μ„± + * Ractor와 Threadλ₯Ό κ²°ν•©ν•  λ•Œ λ°œμƒν•  수 μžˆλŠ” λ°λ“œλ½ μˆ˜μ • + * Ractorμ—μ„œ require 및 autoload κ΄€λ ¨ 문제 μˆ˜μ • + * Ractor κ°„ 인코딩/νŠΈλžœμŠ€μ½”λ”© 문제 μˆ˜μ • + * GC μž‘μ—… 및 λ©”μ„œλ“œ λ¬΄νš¨ν™”μ˜ 경쟁 쑰건 μˆ˜μ • + * Ractor μ‹œμž‘ ν›„ ν”„λ‘œμ„ΈμŠ€ fork κ΄€λ ¨ 문제 μˆ˜μ • + +## JIT + +* ZJIT + * [μ‹€ν—˜μ  λ©”μ„œλ“œ 기반 JIT 컴파일러](https://docs.ruby-lang.org/en/master/jit/zjit_md.html)κ°€ λ„μž…λ˜μ—ˆμŠ΅λ‹ˆλ‹€. + `--zjit` 지원을 ν™œμ„±ν™”ν•˜λ €λ©΄ Rust 1.85.0 μ΄μƒμœΌλ‘œ Rubyλ₯Ό λΉŒλ“œν•˜μ„Έμš”. + * Ruby 4.0.0 κΈ°μ€€, ZJITλŠ” 인터프리터보닀 λΉ λ₯΄μ§€λ§Œ 아직 YJIT만큼 λΉ λ₯΄μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€. + ZJIT μ‹€ν—˜μ„ ꢌμž₯ν•˜μ§€λ§Œ, 아직 ν”„λ‘œλ•μ…˜ λ°°ν¬λŠ” ꢌμž₯ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. + * Ruby 4.1μ—μ„œ ZJITλ₯Ό YJIT보닀 λΉ λ₯΄κ²Œ λ§Œλ“€κ³  ν”„λ‘œλ•μ…˜μ— μ‚¬μš©ν•  수 있게 λ§Œλ“œλŠ” 것이 λͺ©ν‘œμž…λ‹ˆλ‹€. +* YJIT + * `RubyVM::YJIT.runtime_stats` + * `ratio_in_yjit`λŠ” κΈ°λ³Έ λΉŒλ“œμ—μ„œ 더 이상 μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. + `--yjit-stats`μ—μ„œ ν™œμ„±ν™”ν•˜λ €λ©΄ `configure`μ—μ„œ `--enable-yjit=stats`λ₯Ό μ‚¬μš©ν•˜μ„Έμš”. + * κΈ°λ³Έ 톡계에 `invalidate_everything`이 μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€. + TracePoint에 μ˜ν•΄ λͺ¨λ“  μ½”λ“œκ°€ λ¬΄νš¨ν™”λ  λ•Œ μ¦κ°€ν•©λ‹ˆλ‹€. + * `RubyVM::YJIT.enable`에 `mem_size:`와 `call_threshold:` μ˜΅μ…˜μ΄ μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€. +* RJIT + * `--rjit`κ°€ μ œκ±°λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μ„œλ“œνŒŒν‹° JIT API의 κ΅¬ν˜„μ„ + [ruby/rjit](https://github.com/ruby/rjit) μ €μž₯μ†Œλ‘œ 이동할 μ˜ˆμ •μž…λ‹ˆλ‹€. + +## 기타 λ³€κ²½ + +μžμ„Έν•œ λ‚΄μš©μ€ [NEWS](https://github.com/ruby/ruby/blob/{{ release.tag }}/NEWS.md) +λ˜λŠ” [컀밋 둜그](https://github.com/ruby/ruby/compare/v3_4_0...{{ release.tag }})λ₯Ό +μ°Έμ‘°ν•˜μ„Έμš”. + +μ΄λŸ¬ν•œ λ³€κ²½μœΌλ‘œ Ruby 3.4.0 이후 +[파일 {{ release.stats.files_changed }}개 λ³€κ²½, {{ release.stats.insertions }}개 μΆ”κ°€(+), {{ release.stats.deletions }}개 μ‚­μ œ(-)](https://github.com/ruby/ruby/compare/v3_4_0...{{ release.tag }}#file_bucket) +κ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€! + +## λ‹€μš΄λ‘œλ“œ + +* <{{ release.url.gz }}> + + SIZE: {{ release.size.gz }} + SHA1: {{ release.sha1.gz }} + SHA256: {{ release.sha256.gz }} + SHA512: {{ release.sha512.gz }} + +* <{{ release.url.xz }}> + + SIZE: {{ release.size.xz }} + SHA1: {{ release.sha1.xz }} + SHA256: {{ release.sha256.xz }} + SHA512: {{ release.sha512.xz }} + +* <{{ release.url.zip }}> + + SIZE: {{ release.size.zip }} + SHA1: {{ release.sha1.zip }} + SHA256: {{ release.sha256.zip }} + SHA512: {{ release.sha512.zip }} + +## Rubyλž€ + +RubyλŠ” 1993년에 Matz(마츠λͺ¨ν†  μœ ν‚€νžˆλ‘œ)κ°€ 처음 κ°œλ°œν–ˆμœΌλ©°, +ν˜„μž¬λŠ” μ˜€ν”ˆ μ†ŒμŠ€λ‘œ 개발되고 μžˆμŠ΅λ‹ˆλ‹€. μ—¬λŸ¬ ν”Œλž«νΌμ—μ„œ μ‹€ν–‰λ˜λ©° +μ „ μ„Έκ³„μ μœΌλ‘œ 특히 μ›Ή κ°œλ°œμ— μ‚¬μš©λ©λ‹ˆλ‹€. + +[Feature #6012]: https://bugs.ruby-lang.org/issues/6012 +[Feature #15408]: https://bugs.ruby-lang.org/issues/15408 +[Feature #17473]: https://bugs.ruby-lang.org/issues/17473 +[Feature #18455]: https://bugs.ruby-lang.org/issues/18455 +[Feature #19630]: https://bugs.ruby-lang.org/issues/19630 +[Bug #19868]: https://bugs.ruby-lang.org/issues/19868 +[Feature #19908]: https://bugs.ruby-lang.org/issues/19908 +[Feature #20610]: https://bugs.ruby-lang.org/issues/20610 +[Feature #20724]: https://bugs.ruby-lang.org/issues/20724 +[Feature #20750]: https://bugs.ruby-lang.org/issues/20750 +[Feature #20884]: https://bugs.ruby-lang.org/issues/20884 +[Feature #20925]: https://bugs.ruby-lang.org/issues/20925 +[Feature #20971]: https://bugs.ruby-lang.org/issues/20971 +[Bug #20974]: https://bugs.ruby-lang.org/issues/20974 +[Feature #21047]: https://bugs.ruby-lang.org/issues/21047 +[Bug #21049]: https://bugs.ruby-lang.org/issues/21049 +[Feature #21166]: https://bugs.ruby-lang.org/issues/21166 +[Bug #21174]: https://bugs.ruby-lang.org/issues/21174 +[Bug #21175]: https://bugs.ruby-lang.org/issues/21175 +[Bug #21185]: https://bugs.ruby-lang.org/issues/21185 +[Feature #21205]: https://bugs.ruby-lang.org/issues/21205 +[Feature #21216]: https://bugs.ruby-lang.org/issues/21216 +[Feature #21219]: https://bugs.ruby-lang.org/issues/21219 +[Feature #21258]: https://bugs.ruby-lang.org/issues/21258 +[Feature #21262]: https://bugs.ruby-lang.org/issues/21262 +[Feature #21275]: https://bugs.ruby-lang.org/issues/21275 +[Feature #21287]: https://bugs.ruby-lang.org/issues/21287 +[Feature #21311]: https://bugs.ruby-lang.org/issues/21311 +[Feature #21347]: https://bugs.ruby-lang.org/issues/21347 +[Feature #21360]: https://bugs.ruby-lang.org/issues/21360 +[Misc #21385]: https://bugs.ruby-lang.org/issues/21385 +[Feature #21389]: https://bugs.ruby-lang.org/issues/21389 +[Feature #21390]: https://bugs.ruby-lang.org/issues/21390 +[Feature #21459]: https://bugs.ruby-lang.org/issues/21459 +[Feature #21527]: https://bugs.ruby-lang.org/issues/21527 +[Feature #21550]: https://bugs.ruby-lang.org/issues/21550 +[Feature #21552]: https://bugs.ruby-lang.org/issues/21552 +[Feature #21557]: https://bugs.ruby-lang.org/issues/21557 +[Bug #21654]: https://bugs.ruby-lang.org/issues/21654 From b8929eeabe47561632b6838473bdbd25102bd21d Mon Sep 17 00:00:00 2001 From: "Y. Fred Kim" Date: Tue, 23 Dec 2025 19:07:50 +0900 Subject: [PATCH 2/2] Apply suggestions from code review Co-authored-by: Chayoung You --- ...2025-12-18-ruby-4-0-0-preview3-released.md | 58 +++++++++---------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/ko/news/_posts/2025-12-18-ruby-4-0-0-preview3-released.md b/ko/news/_posts/2025-12-18-ruby-4-0-0-preview3-released.md index 2debeb9388..68b2b4ddb0 100644 --- a/ko/news/_posts/2025-12-18-ruby-4-0-0-preview3-released.md +++ b/ko/news/_posts/2025-12-18-ruby-4-0-0-preview3-released.md @@ -43,7 +43,7 @@ Ruby 4.0은 Ruby::Box와 "ZJIT"λ₯Ό λ„μž…ν•˜κ³ , λ§Žμ€ κ°œμ„ μ„ μΆ”κ°€ν•©λ‹ˆ ## μ½”μ–΄ 클래슀 λ³€κ²½ -주의: μ£Όλͺ©ν• λ§Œν•œ 클래슀 λ³€κ²½λ§Œμ„ ν¬ν•¨ν•©λ‹ˆλ‹€. +주의: μ£Όλͺ©ν•  λ§Œν•œ 클래슀 λ³€κ²½λ§Œμ„ ν¬ν•¨ν•©λ‹ˆλ‹€. * Kernel @@ -67,7 +67,7 @@ Ruby 4.0은 Ruby::Box와 "ZJIT"λ₯Ό λ„μž…ν•˜κ³ , λ§Žμ€ κ°œμ„ μ„ μΆ”κ°€ν•©λ‹ˆ [[Feature #21219]] - * Deprecate λ˜μ—ˆλ˜, μ„ ν–‰ `|`λ₯Ό μ‚¬μš©ν•œ `Kernel#open`의 ν”„λ‘œμ„ΈμŠ€ 생성 κΈ°λŠ₯이 μ œκ±°λ˜μ—ˆμŠ΅λ‹ˆλ‹€. + * 폐기 μ˜ˆμ •μ΄μ—ˆλ˜, μ„ ν–‰ `|`λ₯Ό μ‚¬μš©ν•œ `Kernel#open`의 ν”„λ‘œμ„ΈμŠ€ 생성 κΈ°λŠ₯이 μ œκ±°λ˜μ—ˆμŠ΅λ‹ˆλ‹€. [[Feature #19630]] * Binding @@ -78,7 +78,7 @@ Ruby 4.0은 Ruby::Box와 "ZJIT"λ₯Ό λ„μž…ν•˜κ³ , λ§Žμ€ κ°œμ„ μ„ μΆ”κ°€ν•©λ‹ˆ * File - * `File::Stat#birthtime`이 컀널과 νŒŒμΌμ‹œμŠ€ν…œμ—μ„œ μ§€μ›λ˜λŠ” 경우 statx μ‹œμŠ€ν…œ μ½œμ„ 톡해 + * 컀널과 파일 μ‹œμŠ€ν…œμ—μ„œ μ§€μ›ν•˜λŠ” 경우, `File::Stat#birthtime`이 statx μ‹œμŠ€ν…œ μ½œμ„ 톡해 Linuxμ—μ„œ μ‚¬μš© κ°€λŠ₯ν•©λ‹ˆλ‹€. [[Feature #21205]] * IO @@ -86,7 +86,7 @@ Ruby 4.0은 Ruby::Box와 "ZJIT"λ₯Ό λ„μž…ν•˜κ³ , λ§Žμ€ κ°œμ„ μ„ μΆ”κ°€ν•©λ‹ˆ * `IO.select`λŠ” νƒ€μž„μ•„μ›ƒ 인자둜 `Float::INFINITY`λ₯Ό ν—ˆμš©ν•©λ‹ˆλ‹€. [[Feature #20610]] - * Deprecate λ˜μ—ˆλ˜, μ„ ν–‰ `|`λ₯Ό μ‚¬μš©ν•œ `IO` 클래슀 λ©”μ„œλ“œμ˜ ν”„λ‘œμ„ΈμŠ€ 생성 κΈ°λŠ₯이 μ œκ±°λ˜μ—ˆμŠ΅λ‹ˆλ‹€. + * 폐기 μ˜ˆμ •μ΄μ—ˆλ˜, μ„ ν–‰ `|`λ₯Ό μ‚¬μš©ν•œ `IO` 클래슀 λ©”μ„œλ“œμ˜ ν”„λ‘œμ„ΈμŠ€ 생성 κΈ°λŠ₯이 μ œκ±°λ˜μ—ˆμŠ΅λ‹ˆλ‹€. [[Feature #19630]] * Math @@ -96,13 +96,13 @@ Ruby 4.0은 Ruby::Box와 "ZJIT"λ₯Ό λ„μž…ν•˜κ³ , λ§Žμ€ κ°œμ„ μ„ μΆ”κ°€ν•©λ‹ˆ * Method * `Method#source_location`, `Proc#source_location`, `UnboundMethod#source_location`은 - 이제 5개의 μš”μ†Œλ₯Ό κ°€μ§„ ν™•μž₯된 μœ„μΉ˜ 정보λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€: `[path, start_line, start_column, + 이제 5개의 μš”μ†Œλ₯Ό κ°€μ§„ ν™•μž₯된 μœ„μΉ˜ 정보λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. `[path, start_line, start_column, end_line, end_column]`. μ΄μ „μ˜ 2개 μš”μ†Œ ν˜•μ‹ `[path, line]`은 결과에 `.take(2)`λ₯Ό ν˜ΈμΆœν•˜μ—¬ 얻을 수 μžˆμŠ΅λ‹ˆλ‹€. [[Feature #6012]] * Proc - * `Proc#parameters`λŠ” 이제 읡λͺ… 선택적 λ§€κ°œλ³€μˆ˜λ₯Ό `[:opt, nil]` λŒ€μ‹  `[:opt]`둜 ν‘œμ‹œν•˜μ—¬, + * `Proc#parameters`λŠ” 이제 선택적 읡λͺ… λ§€κ°œλ³€μˆ˜λ₯Ό `[:opt, nil]` λŒ€μ‹  `[:opt]`둜 ν‘œμ‹œν•˜μ—¬, 읡λͺ… λ§€κ°œλ³€μˆ˜κ°€ ν•„μˆ˜μΈ κ²½μš°μ™€ μΌκ΄€λœ 좜λ ₯을 μ œκ³΅ν•©λ‹ˆλ‹€. [[Bug #20974]] * Ractor @@ -146,7 +146,7 @@ Ruby 4.0은 Ruby::Box와 "ZJIT"λ₯Ό λ„μž…ν•˜κ³ , λ§Žμ€ κ°œμ„ μ„ μΆ”κ°€ν•©λ‹ˆ * `Ractor#close_incoming`κ³Ό `Ractor#close_outgoing`이 μ œκ±°λ˜μ—ˆμŠ΅λ‹ˆλ‹€. - * 곡유 κ°€λŠ₯ν•œ Proc λ˜λŠ” lambdaλ₯Ό λ§Œλ“€κΈ° μœ„ν•΄ `Ractor.shareable_proc`와 `Ractor.shareable_lambda`κ°€ + * 곡유 κ°€λŠ₯ν•œ Proc λ˜λŠ” lambdaλ₯Ό λ§Œλ“€κΈ° μœ„ν•΄ `Ractor.shareable_proc`κ³Ό `Ractor.shareable_lambda`κ°€ λ„μž…λ˜μ—ˆμŠ΅λ‹ˆλ‹€. [[Feature #21550]], [[Feature #21557]] * Range @@ -154,7 +154,7 @@ Ruby 4.0은 Ruby::Box와 "ZJIT"λ₯Ό λ„μž…ν•˜κ³ , λ§Žμ€ κ°œμ„ μ„ μΆ”κ°€ν•©λ‹ˆ * `Range#to_set`κ³Ό `Enumerator#to_set`은 이제 끝이 μ—†λŠ” λ²”μœ„ 문제λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ 크기 검사λ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€. [[Bug #21654]] - * `Range#overlap?`은 이제 λ¬΄ν•œ(경계가 μ—†λŠ”) λ²”μœ„λ₯Ό μ˜¬λ°”λ₯΄κ²Œ μ²˜λ¦¬ν•©λ‹ˆλ‹€. + * `Range#overlap?`은 이제 λ¬΄ν•œν•œ(경계가 μ—†λŠ”) λ²”μœ„λ₯Ό μ˜¬λ°”λ₯΄κ²Œ μ²˜λ¦¬ν•©λ‹ˆλ‹€. [[Bug #21185]] * μ‹œμž‘μ΄ μ—†λŠ” μ •μˆ˜ λ²”μœ„μ—μ„œ `Range#max` λ™μž‘μ΄ μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€. @@ -174,14 +174,14 @@ Ruby 4.0은 Ruby::Box와 "ZJIT"λ₯Ό λ„μž…ν•˜κ³ , λ§Žμ€ κ°œμ„ μ„ μΆ”κ°€ν•©λ‹ˆ * Set - * `Set`은 이제 μ½”μ–΄ 클래슀이며, 더 이상 autoloaded stdlib ν΄λž˜μŠ€κ°€ μ•„λ‹™λ‹ˆλ‹€. + * `Set`은 이제 μ½”μ–΄ 클래슀이며, 더 이상 μžλ™ λ‘œλ“œλ˜λŠ” ν‘œμ€€ 라이브러리 ν΄λž˜μŠ€κ°€ μ•„λ‹™λ‹ˆλ‹€. [[Feature #21216]] * `Set#inspect`은 이제 `Set[]` ꡬ문을 μ‚¬μš©ν•˜μ—¬ `eval`에 μ ν•©ν•œ λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•©λ‹ˆλ‹€ (예: `#` λŒ€μ‹  `Set[1, 2, 3]`). μ΄λŠ” Array, Hash와 같은 λ‹€λ₯Έ μ½”μ–΄ μ»¬λ ‰μ…˜ ν΄λž˜μŠ€μ™€ 일관성을 μœ μ§€ν•©λ‹ˆλ‹€. [[Feature #21389]] - * `Set#to_set`κ³Ό `Enumerable#to_set`에 인자λ₯Ό μ „λ‹¬ν•˜λŠ” 것은 deprecate λ˜μ—ˆμŠ΅λ‹ˆλ‹€. + * `Set#to_set`κ³Ό `Enumerable#to_set`에 인자λ₯Ό μ „λ‹¬ν•˜λŠ” 것은 폐기 μ˜ˆμ • μƒνƒœκ°€ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. [[Feature #21390]] * Socket @@ -233,7 +233,7 @@ Ruby 4.0은 Ruby::Box와 "ZJIT"λ₯Ό λ„μž…ν•˜κ³ , λ§Žμ€ κ°œμ„ μ„ μΆ”κ°€ν•©λ‹ˆ * readline 0.0.4 * fiddle 1.1.8 -μ£Όλͺ©ν• λ§Œν•œ κΈ°λŠ₯ 변경인 ν‘œμ€€ 라이브러리 λ³€κ²½λ§Œμ„ λ‚˜μ—΄ν•©λ‹ˆλ‹€. +μ£Όλͺ©ν•  λ§Œν•œ κΈ°λŠ₯ 변경인 ν‘œμ€€ 라이브러리 λ³€κ²½λ§Œμ„ λ‚˜μ—΄ν•©λ‹ˆλ‹€. λ‹€λ₯Έ λ³€κ²½ 사항은 μ•„λž˜ μ„Ήμ…˜μ— λ‚˜μ—΄λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. Ruby 3.3.0 이후 λ²ˆλ“€λœ λ²„μ „μ˜ 릴리슀 νžˆμŠ€ν† λ¦¬κ°€ GitHub λ¦΄λ¦¬μŠ€μ— μžˆλŠ” 경우 ν•¨κ»˜ λ‚˜μ—΄ν–ˆμŠ΅λ‹ˆλ‹€. @@ -302,7 +302,7 @@ Ruby 4.0은 Ruby::Box와 "ZJIT"λ₯Ό λ„μž…ν•˜κ³ , λ§Žμ€ κ°œμ„ μ„ μΆ”κ°€ν•©λ‹ˆ * 14.0보닀 였래된 MSVC 버전(_MSC_VER 1900) 지원이 μ€‘λ‹¨λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” Visual Studio 2015 이상이 ν•„μš”ν•¨μ„ μ˜λ―Έν•©λ‹ˆλ‹€. -## ν˜Έν™˜μ„± 이슈 +## ν˜Έν™˜μ„± 문제 * `Ractor::Port` μΆ”κ°€λ‘œ 인해 λ‹€μŒ λ©”μ„œλ“œκ°€ Ractorμ—μ„œ μ œκ±°λ˜μ—ˆμŠ΅λ‹ˆλ‹€. @@ -313,16 +313,16 @@ Ruby 4.0은 Ruby::Box와 "ZJIT"λ₯Ό λ„μž…ν•˜κ³ , λ§Žμ€ κ°œμ„ μ„ μΆ”κ°€ν•©λ‹ˆ [[Feature #21262]] -* `ObjectSpace._id2ref`κ°€ deprecate λ˜μ—ˆμŠ΅λ‹ˆλ‹€. [[Feature #15408]] +* `ObjectSpace._id2ref`κ°€ 폐기 μ˜ˆμ • μƒνƒœκ°€ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. [[Feature #15408]] * `Process::Status#&`와 `Process::Status#>>`κ°€ μ œκ±°λ˜μ—ˆμŠ΅λ‹ˆλ‹€. - Ruby 3.3μ—μ„œ deprecate 된 λ°” μžˆμŠ΅λ‹ˆλ‹€. [[Bug #19868]] + Ruby 3.3μ—μ„œ 폐기 μ˜ˆμ • μƒνƒœκ°€ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. [[Bug #19868]] * `rb_path_check`κ°€ μ œκ±°λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 이 ν•¨μˆ˜λŠ” Ruby 2.7μ—μ„œ 제거된 - `$SAFE` 경둜 검사에 μ‚¬μš©λ˜μ—ˆμ—ˆμœΌλ©°, 이미 deprecate λ˜μ—ˆμ—ˆμŠ΅λ‹ˆλ‹€. + `$SAFE` 경둜 검사에 μ‚¬μš©λ˜μ—ˆμ—ˆμœΌλ©°, 이미 폐기 μ˜ˆμ •μ΄μ—ˆμŠ΅λ‹ˆλ‹€. [[Feature #20971]] -## ν‘œμ€€ 라이브러리 ν˜Έν™˜μ„± 이슈 +## ν‘œμ€€ 라이브러리 ν˜Έν™˜μ„± 문제 * CGI λΌμ΄λΈŒλŸ¬λ¦¬κ°€ κΈ°λ³Έ gemμ—μ„œ μ œκ±°λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 이제 λ‹€μŒ λ©”μ„œλ“œλ₯Ό μœ„ν•œ `cgi/escape`만 μ œκ³΅ν•©λ‹ˆλ‹€. @@ -335,7 +335,7 @@ Ruby 4.0은 Ruby::Box와 "ZJIT"λ₯Ό λ„μž…ν•˜κ³ , λ§Žμ€ κ°œμ„ μ„ μΆ”κ°€ν•©λ‹ˆ [[Feature #21258]] * `Set`이 ν‘œμ€€ λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ μ½”μ–΄ 클래슀둜 이동함에 따라, `set/sorted_set.rb`κ°€ - μ œκ±°λ˜μ—ˆκ³ , `SortedSet`은 더 이상 autoloaded μƒμˆ˜κ°€ μ•„λ‹™λ‹ˆλ‹€. `SortedSet`을 μ‚¬μš©ν•˜λ €λ©΄ + μ œκ±°λ˜μ—ˆκ³ , `SortedSet`은 더 이상 μžλ™ λ‘œλ“œλ˜λŠ” μƒμˆ˜κ°€ μ•„λ‹™λ‹ˆλ‹€. `SortedSet`을 μ‚¬μš©ν•˜λ €λ©΄ `sorted_set` gem을 μ„€μΉ˜ν•˜κ³  `require 'sorted_set'`을 톡해 μ΄μš©ν•΄μ£Όμ„Έμš”. [[Feature #21287]] @@ -343,7 +343,7 @@ Ruby 4.0은 Ruby::Box와 "ZJIT"λ₯Ό λ„μž…ν•˜κ³ , λ§Žμ€ κ°œμ„ μ„ μΆ”κ°€ν•©λ‹ˆ * IO - * `rb_thread_fd_close`κ°€ deprecate λ˜μ—ˆμœΌλ©° 이제 아무 μž‘μ—…λ„ ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. + * `rb_thread_fd_close`λŠ” 폐기 μ˜ˆμ • μƒνƒœκ°€ λ˜μ—ˆμœΌλ©° 이제 아무 μž‘μ—…λ„ ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. C ν™•μž₯μ—μ„œ Ruby μ½”λ“œλ‘œ 파일 λ””μŠ€ν¬λ¦½ν„°λ₯Ό λ…ΈμΆœν•΄μ•Ό ν•˜λŠ” 경우, `RUBY_IO_MODE_EXTERNAL`을 μ‚¬μš©ν•˜μ—¬ `IO` μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€κ³  `rb_io_close(io)`λ₯Ό μ‚¬μš©ν•˜μ—¬ λ‹«μœΌμ„Έμš”(μ΄λ ‡κ²Œ ν•˜λ©΄ `IO` μΈμŠ€ν„΄μŠ€μ˜ λͺ¨λ“  λŒ€κΈ° 쀑인 μž‘μ—…λ„ μΈν„°λŸ½νŠΈν•˜κ³  λŒ€κΈ°ν•©λ‹ˆλ‹€). @@ -380,11 +380,11 @@ Ractorλ₯Ό 더 μ•ˆμ •μ μ΄κ³ , μ„±λŠ₯이 μ’‹κ³ , μ‚¬μš©ν•˜κΈ° μ‰½κ²Œ λ§Œλ“€κΈ° μ΄λŸ¬ν•œ κ°œμ„ μœΌλ‘œ Ractor κ΅¬ν˜„μ΄ μ‹€ν—˜μ  μƒνƒœλ₯Ό λ²—μ–΄λ‚˜λŠ” 데 더 κ°€κΉŒμ›Œμ‘ŒμŠ΅λ‹ˆλ‹€. * μ„±λŠ₯ κ°œμ„  - * λ™κ²°λœ λ¬Έμžμ—΄κ³Ό 심볼 ν…Œμ΄λΈ”μ€ λ‚΄λΆ€μ μœΌλ‘œ 잠금 μ—†λŠ” ν•΄μ‹œ 셋을 μ‚¬μš©ν•©λ‹ˆλ‹€ - * λ©”μ„œλ“œ μΊμ‹œ μ‘°νšŒλŠ” λŒ€λΆ€λΆ„μ˜ 경우 μž κΈˆμ„ ν”Όν•©λ‹ˆλ‹€ - * 클래슀(및 geniv) μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ 접근이 더 λΉ λ₯΄κ³  μž κΈˆμ„ ν”Όν•©λ‹ˆλ‹€ - * 객체 ν• λ‹Ή 쀑 μΊμ‹œ 경합을 ν”Όν•©λ‹ˆλ‹€ - * `object_id`λŠ” λŒ€λΆ€λΆ„μ˜ 경우 μž κΈˆμ„ ν”Όν•©λ‹ˆλ‹€ + * μ–Όλ¦° λ¬Έμžμ—΄κ³Ό 심볼 ν…Œμ΄λΈ”μ€ λ‚΄λΆ€μ μœΌλ‘œ 잠금 μ—†λŠ” ν•΄μ‹œ μ…‹ μ‚¬μš© + * λ©”μ„œλ“œ μΊμ‹œ μ‘°νšŒλŠ” λŒ€λΆ€λΆ„μ˜ 경우 μž κΈˆμ„ νšŒν”Ό + * 클래슀(및 geniv) μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ 접근이 더 λΉ λ₯΄κ³  μž κΈˆμ„ νšŒν”Ό + * 객체 ν• λ‹Ή 쀑 μΊμ‹œ 경합을 νšŒν”Ό + * `object_id`λŠ” λŒ€λΆ€λΆ„μ˜ 경우 μž κΈˆμ„ νšŒν”Ό * 버그 μˆ˜μ • 및 μ•ˆμ •μ„± * Ractor와 Threadλ₯Ό κ²°ν•©ν•  λ•Œ λ°œμƒν•  수 μžˆλŠ” λ°λ“œλ½ μˆ˜μ • * Ractorμ—μ„œ require 및 autoload κ΄€λ ¨ 문제 μˆ˜μ • @@ -417,9 +417,8 @@ Ractorλ₯Ό 더 μ•ˆμ •μ μ΄κ³ , μ„±λŠ₯이 μ’‹κ³ , μ‚¬μš©ν•˜κΈ° μ‰½κ²Œ λ§Œλ“€κΈ° λ˜λŠ” [컀밋 둜그](https://github.com/ruby/ruby/compare/v3_4_0...{{ release.tag }})λ₯Ό μ°Έμ‘°ν•˜μ„Έμš”. -μ΄λŸ¬ν•œ λ³€κ²½μœΌλ‘œ Ruby 3.4.0 이후 -[파일 {{ release.stats.files_changed }}개 λ³€κ²½, {{ release.stats.insertions }}개 μΆ”κ°€(+), {{ release.stats.deletions }}개 μ‚­μ œ(-)](https://github.com/ruby/ruby/compare/v3_4_0...{{ release.tag }}#file_bucket) -κ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€! +μ΄λŸ¬ν•œ 변경사항에 따라, Ruby 3.4.0 μ΄ν›„λ‘œ [파일 {{ release.stats.files_changed }}개 λ³€κ²½, {{ release.stats.insertions }}쀄 μΆ”κ°€(+), {{ release.stats.deletions }}쀄 μ‚­μ œ(-)](https://github.com/ruby/ruby/compare/v3_4_0...{{ release.tag }}#file_bucket)κ°€ +μ΄λ£¨μ–΄μ‘ŒμŠ΅λ‹ˆλ‹€! ## λ‹€μš΄λ‘œλ“œ @@ -444,10 +443,10 @@ Ractorλ₯Ό 더 μ•ˆμ •μ μ΄κ³ , μ„±λŠ₯이 μ’‹κ³ , μ‚¬μš©ν•˜κΈ° μ‰½κ²Œ λ§Œλ“€κΈ° SHA256: {{ release.sha256.zip }} SHA512: {{ release.sha512.zip }} -## Rubyλž€ +## RubyλŠ” -RubyλŠ” 1993년에 Matz(마츠λͺ¨ν†  μœ ν‚€νžˆλ‘œ)κ°€ 처음 κ°œλ°œν–ˆμœΌλ©°, -ν˜„μž¬λŠ” μ˜€ν”ˆ μ†ŒμŠ€λ‘œ 개발되고 μžˆμŠ΅λ‹ˆλ‹€. μ—¬λŸ¬ ν”Œλž«νΌμ—μ„œ μ‹€ν–‰λ˜λ©° +RubyλŠ” 1993년에 Matz(마츠λͺ¨ν†  μœ ν‚€νžˆλ‘œ)κ°€ 처음 κ°œλ°œν–ˆκ³ , +ν˜„μž¬λŠ” μ˜€ν”ˆ μ†ŒμŠ€λ‘œ 개발되고 μžˆμŠ΅λ‹ˆλ‹€. μ—¬λŸ¬ ν”Œλž«νΌμ—μ„œ λ™μž‘ν•˜λ©°, μ „ μ„Έκ³„μ μœΌλ‘œ 특히 μ›Ή κ°œλ°œμ— μ‚¬μš©λ©λ‹ˆλ‹€. [Feature #6012]: https://bugs.ruby-lang.org/issues/6012 @@ -489,3 +488,4 @@ RubyλŠ” 1993년에 Matz(마츠λͺ¨ν†  μœ ν‚€νžˆλ‘œ)κ°€ 처음 κ°œλ°œν–ˆμœΌλ©°, [Feature #21552]: https://bugs.ruby-lang.org/issues/21552 [Feature #21557]: https://bugs.ruby-lang.org/issues/21557 [Bug #21654]: https://bugs.ruby-lang.org/issues/21654 +[Feature #21552]: https://bugs.ruby-lang.org/issues/21552