naruse tarafından 23.11.2019 tarihinde gönderildi
Çeviri: İsmail Arılık
Ruby 2.7.0-preview3’ün 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 preview3 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, reline
ve readline
‘a uyumlu saf bir Ruby gerçeklemesi 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
‘de 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 parametresi olarak numaralanmış parametre, 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}
-
self
üstünden ö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.
-
-
(geri alındı),Symbol#to_s
Module#name
,true.to_s
,false.to_s
venil.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] -
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.
- 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 hatadır. -
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
geri alındınil
ileRegexp#match{?}
(String ve Symbol olarak) TypeError yükseltir [Özellik #13083]
3895 dosya değişti, 213426 ekleme(+), 96934 silme(-) yapıldı 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 olan değişikliklerin istatistikleri!
Ruby 2.7 ile programlamanın tadını çıkarın!
Download
-
https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0-preview3.tar.bz2
SIZE: 14630824 SHA1: 1fa35d8a26dfc814e92fa259095f4cf70f386f87 SHA256: df2ddee659873e6fc30a8590ecffa49cf3a4ef81fa922b0d09f821b69ee88bc3 SHA512: 5d8e99e3fd984c7d05c0bc483e1504e81ccdb920cbb2d78cad3c314e197b30316b692fd0199f836acac41246e3a713cb81dc6dd64c27cba56f807df4c193db1a
-
https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0-preview3.tar.gz
SIZE: 16723536 SHA1: 7554926ee29a344da4b53d67fc296d70fdbe60ca SHA256: 9baa1f5096ebc2a0923df628d7dc7105da3789c1bf8b873469d9010249736b00 SHA512: 8fad3e761fd54036fee974a9f33e4db31d9a8a878b1181a08724388f5a1da548ab249136356f675797e9c43b565777bf22e6a419db1364336f134b31f4e75b33
-
https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0-preview3.tar.xz
SIZE: 11923988 SHA1: f3c54538915483e5ddc714ac23414e7c47048b12 SHA256: ad9d61e55ac224e3447a762e001965839846f9658f87a0e792840887cfe61b8c SHA512: 2b6844f34d32f1013dc3110043e6ece33a083b20f1343dea9a14311bda0017e8f56fc7d73be1616999b22ce430d7ba59a77bb0892d27c6d1ec243c3860086133
-
https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0-preview3.zip
SIZE: 20691541 SHA1: d18b494cda4db751d8b3f5026404e348f3f682e3 SHA256: 2bc95f67f271b6a41fc3dd40536705b4a7974df8a2fa33ff0758a60822291781 SHA512: af9f728aebc53693cbd9f78a632c82e851e9f83dfc0c53979fdc37c627b11482c8435ce12dbb1d5a7253e998ea989759be699e6a00aae18384d2d765650cb0d7
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.