Ruby 4.0 Yayınlandı 🎉
Her sene olduğu gibi bu sene de Noel’de Ruby’nin yeni versiyonu duyuruldu. Ben şahsen Ruby 4'ü beklemiyordum. Sene içerisinde 3.4 üzerinde çalışmalar devam ediyordu. Geçen sene yeni bir major Ruby sürümü duyurulmadı ve bana kalırsa bu seneyi de boş geçmemek adına Ruby 4’ü bizlere duyurdular. Özelliklere bakınca yeni bir sürüm için yeterli olduğunu pek düşünmüyorum ancak hala heyecan verici şeyler de var. Birlikte bakalım.
Ruby::Box
Tam olarak yeni bir özellik değil. Daha önceden kullanılan Ruby::Namespace yerine gelmiş, biraz daha açıklayıcı bir değişiklik aslında.
Peki bu ne anlama geliyor?
Ruby Box, tanımlamaları birbirinden izole etmenizi sağlayan deneysel bir özellik. Bir kutu içinde yüklenen her şey, monkey patch'ler, global değişkenler, sınıf tanımlamaları, kütüphaneler, o kutunun içinde kalıyor ve dışarıyı etkilemiyor.
# RUBY_BOX=1 ortam değişkeni ile etkinleştirin
box = Ruby::Box.new
box.eval("class String; def merhaba; 'Merhaba!'; end; end")
# Bu monkey patch sadece bu box içinde geçerli!Kullanım Senaryoları
- Test izolasyonu: Monkey patch kullanan testlerin diğer testleri etkilememesi
- Blue-green deployment: Tek bir Ruby sürecinde paralel web uygulaması kutularını çalıştırma
- Bağımlılık değerlendirmesi: Yeni bağımlılık sürümlerini güvenli bir ortamda test etme
Bu özellik deneysel olarak duyuruldu. Zaten bu tip daha temel değişiklikleri deneysel olarak görmeye alıştık. Ama gelecek için heyecan verici.
ZJIT
Alfabedeki bütün harfler bitti ve sıra ZJIT'e geldi 😬 Yeni JIT derleyicimiz bu Ruby versiyonunda hayatımıza giriyor. Shopify, YJIT'i duyurmuş ve güncel Ruby sürümlerine dahil etmişti. Şimdi sıra Z'de.
ZJIT, YJIT'in deneyimlerinden yola çıkarak sıfırdan tasarlandı. Temel hedefleri:
- Daha yüksek performans tavanı: Daha büyük derleme birimleri ve SSA IR
- Daha fazla topluluk katkısı: Daha geleneksel bir method derleyici mimarisi
# ZJIT'i etkinleştirmek için
ruby --zjit your_script.rb
# veya kod içinden
RubyVM::ZJIT.enableBir dip not yapalım; ZJIT, YJIT kadar performanslı değil henüz. Ruby 4.1 ile daha hızlı ve production-ready olacak deniyor. Bekleyip göreceğiz.
Ractor İyileştirmeleri
Ruby ile paralele doğru adlı programın sunucusu Ractor. Kullanmak kısmet olmadı. Tam olarak nasıl çalışıyor ve ne yapıyor onu da bilmiyorum ama cidden öğrenmek istiyorum 2026 senesinde. Ruby 3'de deneyseldi ancak artık içeri alındı.
Ractor::Port gibi iyileştirmeler var. Ractor'ler arası iletişim artık bu şekilde yapılacak.
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, 12Ractor.shareable_proc ise Proc nesnelerini Ractor'lar arasında paylaşmayı kolaylaştırıyor. Diğer detaylar ise; Frozen string'ler ve sembol tablosu kilitsiz hash set kullanıyor. Method cache aramaları çoğu durumda kilitleme gerektirmiyor ve CPU önbellek çekişmesi önemli ölçüde azaltıldığı söyleniyor.
Dil Değişiklikleri
Mantıksal Operatörler Satır Başında
Artık &&, ||, and, or operatörlerini satır başında kullanabilirsiniz:
# Ruby 4.0'da bu geçerli!
if condition1
&& condition2
&& condition3
do_something
endBu özellik, uzun koşulları daha okunabilir yazmamızı sağlıyor.
*nil Davranış Değişikliği
*nil artık nil.to_a'yı çağırmıyor. Bu, **nil'in nil.to_hash'i çağırmamasıyla tutarlı hale getirildi.
Temel Sınıf Güncellemeleri
Set Artık Çekirdek Sınıf
require 'set' devri artık bitti. Set artık Ruby içinde geliyor.
my_set = Set[1, 2, 3]
my_set.inspect #=> "Set[1, 2, 3]" # Yeni, daha temiz gösterimPathname Çekirdek Sınıf Oldu
Pathname de artık bir çekirdek sınıf. Dosya yolu işlemlerinde ek gem gerekmeden kullanılabilir.
Array#rfind
Sondan arama yapmak için yeni, verimli bir method:
[1, 2, 3, 4, 5].rfind { |x| x.even? } #=> 4
# array.reverse_each.find'dan çok daha verimli!Kernel#inspect Özelleştirmesi
Artık hangi instance değişkenlerinin inspect'te görüneceğini kontrol edebilirsiniz:
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", "gizli123")
conf.inspect
#=> #<DatabaseConfig:0x... @host="localhost", @user="root">
# @password gizli kalıyor!ErrorHighlight İyileştirmesi
ArgumentError artık hem çağıran hem de çağrılan tarafı gösteriyor:
test.rb:1:in 'Object#add': wrong number of arguments (given 1, expected 2) (ArgumentError)
caller: test.rb:3
| add(1)
^^^
callee: test.rb:1
| def add(x, y) = x + yRuby'de dert olan hata ayıklama işi, bu geliştirme ile biraz daha kolaylaştı. Ruby'deki son geliştirmeler, developer'ları daha da mutlu ediyor. En azından beni 😅
RubyGems ve Bundler 4.0
Burada Ruby dramasına girmeyeceğim merak etmeyin.
Ruby 4.0 ile birlikte RubyGems ve Bundler da 4.0 sürümüne yükseltildi. Bu major güncelleme bazı breaking change'ler içeriyor, bu yüzden mevcut projelerinizi güncellerken dikkatli olun.
Sonuç
Bu benim yazı benim ilk Türkçe yazım oldu bu yeni blog'umdaki. Ruby 4.0'a gelmesi de manidar oldu.
Ruby 4'den ben daha fazlasını beklerdim. Yeni bir sürüm çıkartıyorsanız daha fazla büyük değişiklik olması gerekirdi. Ayrıca geliştirici mutluluğu adına pek bir şey görmedim. Ruby 4'ün minor geliştirmelerinde umarım bir takım yenilikler görürüz.
Peki sizi Ruby 4 heyecanlandırıyor mu? Siz neler düşünüyorsunuz yeni versiyon hakkında?