Ruby 2.7.0-rc1 Yayınlandı

Ruby 2.7.0-rc1’in yayınlandığını duyurmaktan memnuniyet duyuyoruz.

Bir önizleme sürümü, Aralık’ta yayınlanması planlanan son sürüm için geri bildirim toplamak için yayınlanır. Bu rc1 sürümünün asıl amacı anahtar kelime argümanlarının uyumluluğunu onaylamaktır.

Bu sürüm ayrıca birkaç yeni özellik ve performans iyileştirmesi içermektedir, bunların en önemlileri:

  • Sıkıştırma GC
  • Desen Eşleştirme
  • REPL iyileştirmesi
  • Konumsal argümanların ve anahtar kelime argümanlarının ayrılması

Sıkıştırma GC

Bu sürüm, parçalanmış hafıza alanını birleştirebilen Sıkıştırma GC’yi tanıtmaktadır.

Bazı çok thread’li Ruby programları hafıza parçalanmasına neden olabilir, bu da yüksek hafıza kullanımı ve hız düşüşüne neden olur.

GC.compact metodu, heap’i sıkıştırmak için eklenmiştir. Bu fonksiyon heap’teki canlı nesneleri sıkıştırır, böylece daha az sayfa kullanılabilir ve heap daha CoW canlısı olabilir. Özellik #15626

Desen Eşleştirme [Deneysel]

Desen eşleştirme deneysel bir özellik olarak eklenmiştir, bu özellik fonksiyonel programlama dillerinde sıklıkla kullanılır. Özellik #14912

Bu özellik, verilen bir nesne üzerinde yürüyebilir ve eğer bu nesne bir desenle eşleşirse, bu nesnenin değerini atayabilir.

require "json"

json = <<END
{
  "name": "Alice",
  "age": 30,
  "children": [{ "name": "Bob", "age": 2 }]
}
END

case JSON.parse(json, symbolize_names: true)
in {name: "Alice", children: [{name: "Bob", age: age}]}
  p age #=> 2
end

Daha fazla ayrıntı için lütfen Desen eşleştirme - Ruby 2.7’de yeni bir özellik‘e bakın.

REPL iyileştirmesi

Ruby ile gelen etkileşimli ortam (REPL; Read-Eval-Print-Loop) olan irb şimdi çoklu satır değiştirmeyi destekliyor. Bu özellik saf Ruby’de gerçeklenen, readline‘a uyumlu bir kütüphane olan reline tarafından güçlendirilmiştir. Ayrıca bu, rdoc bütünleşimi de sağlamaktadır. irb‘de ayrıca verilen bir sınıf, modül ya da metodun başvurusunu da görüntüleyebilirsiniz. Özellik #14683, Özellik #14787, Özellik #14918

Üstelik şimdi Binding#irb tarafından gösterilen kaynak satırları ve temel sınıf nesnelerinin gözlem sonuçları renklendiriliyor.

Konumsal argümanların ve anahtar kelime argümanlarının ayrılması

Anahtar kelime argümanlarının ve konumsal argümanların otomatik dönüştürülmesi ileride kaldırılacak olarak işaretlendi ve Ruby 3’te kaldırılacak. [Özellik #14183]

  • Eğer bir metod çağrısı son argümanı olarak bir Hash geçirirse, ve hiç anahtar kelime geçirmezse, ve çağrılan metod anahtar kelimeler kabul ediyorsa, bir uyarı yayınlanır. Hash’in anahtar kelime olarak anlaşılmasını sağlamak, uyarıdan kaçınmak ve Ruby 3’te doğru davranıştan emin olmak için çift yıldız operatörü ekleyin.

    def foo(key: 42); end; foo({key: 42})   # uyarı yayınlanır
    def foo(**kw);    end; foo({key: 42})   # uyarı yayınlanır
    def foo(key: 42); end; foo(**{key: 42}) # İyi
    def foo(**kw);    end; foo(**{key: 42}) # İyi
    
  • Eğer bir metod çağrısı, anahtar kelimeler kabul eden bir metoda anahtar kelimeler geçirirse fakat yeterli sayıda zorunlu konumsal argüman geçirmezse, anahtar kelimeler gerekli son konumsal argüman olarak düşünülür ve bir uyarı yayınlanır. Uyarıdan kaçınmak ve Ruby 3’te doğru davranıştan emin olmak için argümanı anahtar kelimeler olarak değil de, hash olarak geçirin.

    def foo(h, **kw); end; foo(key: 42)      # uyarı yayınlanır
    def foo(h, key: 42); end; foo(key: 42)   # uyarı yayınlanır
    def foo(h, **kw); end; foo({key: 42})    # İyi
    def foo(h, key: 42); end; foo({key: 42}) # İyi
    
  • Bir metod belirli anahtar kelimeler bekliyor fakat yıldızlı anahtar kelime beklemiyorsa, ve metoda bir hash ya da hem Symbol hem de Symbol olmayan anahtarları içeren yıldızlı anahtar kelimeler geçirildiyse, hash ayrılmaya devam eder, ve bir uyarı yayınlanır. Ruby 3’te doğru davranıştan emin olmak için çağıran kodu ayrı hash’ler geçirecek şekilde güncellemeniz gerekiyor.

    def foo(h={}, key: 42); end; foo("key" => 43, key: 42)   # uyarı yayınlanır
    def foo(h={}, key: 42); end; foo({"key" => 43, key: 42}) # uyarı yayınlanır
    def foo(h={}, key: 42); end; foo({"key" => 43}, key: 42) # İyi
    
  • Eğer bir metod anahtar kelime kabul etmiyor ve anahtar kelimeler ile çağrıldıysa, anahtar kelimeler yine konumsal hash olarak düşünülür, herhangi bir uyarı yayınlanmaz. Bu davranış Ruby 3’te çalışmaya devam edecek.

    def foo(opt={});  end; foo( key: 42 )   # İyi
    
  • Eğer metod keyfi anahtar kelimeler kabul ediyorsa, anahtar kelime argüman anahtarları olarak sembol olmayanlara izin verilir. [Özellik #14183]

    def foo(**kw); p kw; end; foo("str" => 1) #=> {"str"=>1}
    
  • Harici olarak metodun anahtar kelime almadığını belirtmek için metod tanımlarında **nil kullanılabilir. Böyle bir metodu anahtar kelimeler ile çağırmak ArgumentError ile sonuçlanır. [Özellik #14183]

    def foo(h, **nil); end; foo(key: 1)       # ArgumentError
    def foo(h, **nil); end; foo(**{key: 1})   # ArgumentError
    def foo(h, **nil); end; foo("str" => 1)   # ArgumentError
    def foo(h, **nil); end; foo({key: 1})     # İyi
    def foo(h, **nil); end; foo({"str" => 1}) # İyi
    
  • Anahtar kelime almayan bir metoda boş bir anahtar kelime yıldızı geçirmek artık boş bir hash geçirmiyor. Ancak gerekli bir parametre için boş bir hash gerekliyse, bir uyarı yayınlanır. Konumsal bir hash geçirmeye devam etmek için çift yıldızı kaldırın. [Özellik #14183]

    h = {}; def foo(*a) a end; foo(**h) # []
    h = {}; def foo(a) a end; foo(**h)  # {} ve uyarı
    h = {}; def foo(*a) a end; foo(h)   # [{}]
    h = {}; def foo(a) a end; foo(h)    # {}
    

NOTE: Anahtar kelime argümanı uyumsuzluğu hakkında çok fazla ileride kaldırılma uyarısı fazla gereksiz görüldü. Şu anda iki muhtemel çözüm tartışılıyor; ileride kaldırılma uyarılarını varsayılan olarak devre dışı bırakmak (#16345) ya da tekrarlanmış uyarıları bastırmak (#16289). Son karar verilmedi fakat bu sorun resmi yayında düzeltilecek.

Dikkate Değer Diğer Yeni Özellikler

  • Bir metod referans operatörü (.:), daha önceki bir önizleme sürümünde deneysel bir özellik olarak eklendi fakat geri alındı. [Özellik #12125], [Özellik #13581], [Özellik #16275]

  • Varsayılan blok parametreleri olarak numaralanmış parametreler, deneysel bir özellik olarak eklendi. [Özellik #4475]

  • Başlangıçsız aralık deneysel olarak eklendi. Bu, sonsuz aralık kadar kullanışlı olmayabilir, fakat DSL kullanımları için iyi olacaktır. [Özellik #14799]

    ary[..3]  # ary[0..3] ile aynı
    rel.where(sales: ..100)
    
  • Enumerable#tally eklendi. Bu metod, her öğenin kaç kere geçtiğini sayar.

    ["a", "b", "c", "b"].tally
    #=> {"a"=>1, "b"=>2, "c"=>1}
    
  • Alıcı olarak bir self kalıbı ile özel bir metodu çağırmaya artık izin verilmiyor. [Özellik #11297], [Özellik #16123]

    def foo
    end
    private :foo
    self.foo
    
  • Enumerator::Lazy#eager eklendi. Bu, tembel bir numaralandırıcıdan tembel olmayan bir numaralandırıcı oluşturur. [Özellik #15901]

    a = %w(foo bar baz)
    e = a.lazy.map {|x| x.upcase }.map {|x| x + "!" }.eager
    p e.class               #=> Enumerator
    p e.map {|x| x + "?" }  #=> ["FOO!?", "BAR!?", "BAZ!?"]
    

Performans iyileştirmeleri

  • JIT [Deneysel]

    • JIT edilmiş kod, bir eniyileştirme varsayımı geçersiz kılındığında, daha az eniyileştirilmiş koda yeniden derlenir.

    • Bir metodun saf olduğu düşünülürse, metod satıriçi yapma uygulanır. Bu eniyileme hala deneyseldir ve birçok metod henüz saf olarak düşünülmemektedir.

    • --jit-min-calls‘ın varsayılan değeri 5’ten 10.000’e değiştirildi.

    • --jit-max-cache‘in varsayılan değeri 1.000’den 100’e değiştirildi.

  • Symbol#to_s, Module#name, true.to_s, false.to_s ve nil.to_s artık her zaman donmuş String döndürüyor. Döndürülen String, belirli bir nesne için her zaman aynıdır. [Deneysel] [Özellik #16150]
  • Module#name, true.to_s, false.to_s, ve nil.to_s şimdi her zaman dondurulmuş bir String döndürüyor. Döndürülen String verilen bir nesne için her zaman aynıdır. [Deneysel] [Özellik #16150] Sadece Symbol#to_s geri alındı.

  • CGI.escapeHTML‘in performansı iyileştirildi. GH-2226

  • Monitor ve MonitorMixin’in performansı iyileştirildi. [Özellik #16255]

2.6’dan bu yana dikkate değer diğer değişiklikler

  • Bazı standart kütüphaneler güncellendi.
    • Bundler 2.1.0.pre.3 (Geçmiş)
    • RubyGems 3.1.0.pre.3 (Geçmiş)
    • CSV 3.1.2 (NEWS)
    • Racc 1.4.15
    • REXML 3.2.3 (NEWS)
    • RSS 0.2.8 (NEWS)
    • StringScanner 1.0.3
    • Orijinal sürümü olmayan bazı diğer kütüphaneler de güncellendi.
  • Standart kütüphane varsayılan gemlerle desteklendi
    • Aşağıdaki varsayılan gemler rubygems.org’da yayınlandı
      • benchmark
      • cgi
      • delegate
      • getoptlong
      • net-pop
      • net-smtp
      • open3
      • pstore
      • singleton
    • Aşağıdaki varsayılan gemler sadece ruby-core’u destekledi, henüz rubygems.org’da yayınlanmadı.
      • monitor
      • observer
      • timeout
      • tracer
      • uri
      • yaml
  • Bir blokla çağrılmış bir metodda bloksuz olarak yer alan Proc.new ve proc şimdi bir uyarıdır.

  • Bir blokla çağrılmış bir metodda bloksuz olarak yer alan lambda şimdi bir istisna yükseltir.

  • Unicode ve Emoji sürümleri 11.0.0’dan 12.0.0’a güncellendi. [Özellik #15321]

  • Unicode sürümü 12.1.0’a güncellendi, bu sürüm U+32FF SQUARE ERA NAME REIWA için destek eklemektedir. [Özellik #15195]

  • Date.jisx0301, Date#jisx0301, ve Date.parse yeni Japon dönemini desteklemektedir. [Özellik #15742]

  • Derleyicilerin C99’u desteklemesi zorunlu tutuldu. [Diğer #15347]
  • nil ile Regexp#match{?} (String ve Symbol olarak) TypeError yükseltir [Özellik #13083] geri alındı

Daha fazla ayrıntı için NEWS‘e ya da işleme günlüklerine bakın.

Bu değişiklikler ile birlikte Ruby 2.6.0’dan bu yana 4163 dosya değişti, 226280 ekleme(+), 99449 silme(-) yapıldı! Ruby 2.7 ile programlamanın tadını çıkarın!

İndirin

  • https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0-rc1.tar.bz2

    SIZE: 14691356
    SHA1: f501841276c4a922104b4afb19ff385a6de6b2e0
    SHA256: 1c5a02b63fa9fca37c41681bbbf20c55818a32315958c0a6c8f505943bfcb2d2
    SHA512: b5f96227775f8bdf19f944a555d0a83d7e84b37bd31fe4b8ac008a3272b1a28a4d94abbb1b5570ee32ec0690ba9d476b837a020a5194bee14bebf6f0e768bc79
    
  • https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0-rc1.tar.gz

    SIZE: 16772802
    SHA1: c45cb603ed845d1e0d458d3fdc1afc910b6945b4
    SHA256: 59bd97b82e167453b5c76bc0fbb50ebda15ccee56b9ef1e94d5530b095b8a392
    SHA512: 6710266d221e9fd0ac9d6c40d48ce502badbc8b87ef500bb428b63e1744497903be267860dbc93a78235ef959ae3326f7e3c597b5567df87648fccb216d56f7d
    
  • https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0-rc1.tar.xz

    SIZE: 11987512
    SHA1: 7d57c78a1c05e4d03d9f6726512f2c31d74413d8
    SHA256: 7528db87df7a8cbfdcbd053073839f5a00b2a38f807771e3e45000e72fc86732
    SHA512: 202b1a5bf01e6c398b8745cf968027db507ef39df521b3b24e06c6894d507ffcef9e904fa0d3a47f8be98fe750ca15a9829eb75627dacb4679538a61dabbe368
    
  • https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0-rc1.zip

    SIZE: 20645360
    SHA1: 3f0c415b8c2c674c9d4a86cce48347b15f822de8
    SHA256: f0c73add73c84a0390dca858c8c24e0cab107ada7dea7193e1ae207f78b79193
    SHA512: 23db300274f8a60aa89b3ab4a1685fba527b62c66b6944f03fdb4c32418e65aae3adc909c7c7c8dae743def230dadbf19ec3be6de50a9e955a0049b5c26e4020
    

Ruby nedir

Ruby ilk olarak Matz (Yukihiro Matsumoto) tarafından 1993’te geliştirilmiştir ve şimdi Açık Kaynak olarak geliştirilmektedir. Birçok platformda çalışır ve dünyanın her yerinde kullanılır, özellikle web geliştirmesi için.