naruse tarafından 25.12.2019 tarihinde gönderildi
Çeviri: İsmail Arılık
Ruby 2.7.0’ın yayınlandığını duyurmaktan memnuniyet duyuyoruz.
Bu sürüm birkaç yeni özellik ve performans iyileştirmesi içermektedir, bunların en önemlileri:
- Desen Eşleştirme
- REPL iyileştirmesi
- Sıkıştırma GC
- Konumsal argümanların ve anahtar kelime argümanlarının ayrılması
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 ve 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.
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
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]
Ayrıntılar için “Ruby 3.0’da konumsal argümanların ve anahtar kelime argümanlarının ayrılması” makalesine bakın. Sadece değişiklikler aşağıdaki gibidir.
-
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}) # iyi def foo(**kw); end; foo(**{key: 42}) # iyi
-
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}) # iyi def foo(h, key: 42); end; foo({key: 42}) # iyi
-
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) # iyi
-
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 ) # iyi
-
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}) # iyi def foo(h, **nil); end; foo({"str" => 1}) # iyi
-
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) # {}
İleride kaldırılma uyarılarını kapatmak için lütfen -W:no-deprecated
komut satırı argümanını kullanın ya da Warning[:deprecated] = false
ifadesini kodunuza ekleyin.
Dikkate Değer Diğer Yeni Özellikler
-
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.
-
-
Fiber’in önbellekleme stratejisi değiştirildi ve fiber oluşturma hızlandırıldı. GH-2224
-
Module#name
,true.to_s
,false.to_s
, venil.to_s
şimdi her zaman dondurulmuş String döndürüyor. Döndürülen String belirli bir nesne için her zaman aynıdır. [Deneysel] [Özellik #16150] -
CGI.escapeHTML
‘in performansı iyileştirildi. GH-2226 -
Monitor ve MonitorMixin’in performansı iyileştirildi. [Özellik #16255]
-
1.9’dan beridir var olan çağrı bölgesi başına metod önbellekleme iyileştirildi: Önbellek vurma oranı %89’dan %94’e yükseldi. GH-2583‘e bakın.
-
RubyVM::InstructionSequence#to_binary metodu derlenmiş ikili oluşturur. İkili boyutu düşürüldü. [Feature #16163]
2.6’dan bu yana dikkate değer diğer değişiklikler
- Bazı standart kütüphaneler güncellendi.
- Bundler 2.1.2 (Yayın notu)
- RubyGems 3.1.2
- Racc 1.4.15
- CSV 3.1.2 (NEWS)
- 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.
- Aşağıdaki kütüphaneler artık paketlenmiş gem’ler içinde yer almıyor.
Bu özellikleri kullanmak için ilgili gem’leri kurun.
- CMath (cmath gem’i)
- Scanf (scanf gem’i)
- Shell (shell gem’i)
- Synchronizer (sync gem’i)
- ThreadsWait (thwait gem’i)
- E2MM (e2mmap gem’i)
-
profile.rb
standart kütüphaneden kaldırıldı. - 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
- Aşağıdaki varsayılan gemler rubygems.org’da yayınlandı
-
Bir blokla çağrılmış bir metodda bloksuz olarak yer alan
Proc.new
veproc
şimdi bir uyarıdır. -
Bir blokla çağrılmış bir metodda bloksuz olarak yer alan
lambda
şimdi bir hata 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
, veDate.parse
yeni Japon dönemini desteklemektedir. [Özellik #15742] - Derleyicilerin C99’u desteklemesi zorunlu tutuldu.
[Diğer #15347]
- Lehçemizin ayrıntıları: https://bugs.ruby-lang.org/projects/ruby-master/wiki/C99
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 4190 dosya değişti, 227498 ekleme(+), 99979 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.tar.bz2
SIZE: 14703381 SHA1: b54f4633174dbc55db77d9fd6d0ef90cc35503af SHA256: 7aa247a19622a803bdd29fdb28108de9798abe841254fe8ea82c31d125c6ab26 SHA512: 8b8dd0ceba65bdde53b7c59e6a84bc6bf634c676bfeb2ff0b3604c362c663b465397f31ff6c936441b3daabb78fb7a619be5569480c95f113dd0453488761ce7
-
https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0.tar.gz
SIZE: 16799684 SHA1: 6f4e99b5556010cb27e236873cb8c09eb8317cd5 SHA256: 8c99aa93b5e2f1bc8437d1bbbefd27b13e7694025331f77245d0c068ef1f8cbe SHA512: 973fc29b7c19e96c5299817d00fbdd6176319468abfca61c12b5e177b0fb0d31174a5a5525985122a7a356091a709f41b332454094940362322d1f42b77c9927
-
https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0.tar.xz
SIZE: 11990900 SHA1: 943c767cec037529b8e2d3cc14fc880cad5bad8d SHA256: 27d350a52a02b53034ca0794efe518667d558f152656c2baaf08f3d0c8b02343 SHA512: dd5690c631bf3a2b76cdc06902bcd76a89713a045e136debab9b8a81ff8c433bbb254aa09e4014ca1cf85a69ff4bcb13de11da5e40c224e7268be43ef2194af7
-
https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0.zip
SIZE: 20571744 SHA1: fbebdd3a2a641f9a81f7d8db5abd926acea27e80 SHA256: 8bf2050fa1fc76882f878fd526e4184dc54bd402e385efa80ef5fd3b810522e0 SHA512: 5060f2dd3bfd271ef255b17589d6d014260d7ec2d97b48112b717ee01c62fe125c3fe04f813e02d607cea3f0a2a812b14eb3a28d06c2551354dfeff5f4c3dd6b
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.