Bir yıllık geliştirmenin ardından serbest Program geliştirmede son derece verimli olan ve Perl, Java, Python, Smalltalk, Eiffel, Ada ve Lisp'in en iyi özelliklerini içeren dinamik, nesne yönelimli bir programlama dilidir. Proje kodu, GPL lisansının en son sürümünü ifade eden ve GPLv2 ile tamamen uyumlu olan BSD (“3 maddeli BSDL”) ve “Ruby” lisansları altında dağıtılmaktadır. Ruby 2.7, işlevsel iyileştirmelerin hazırlanmasının bir yıl sürdüğü ve her 2-3 ayda bir bakım sürümleri üreten planlı bir geliştirme sürecinin ardından gelen yedinci büyük sürümdür.
Ana :
- Deneysel desen eşleştirme (), belirli bir nesne üzerinde yineleme yapmanıza ve kalıpla eşleşme olması durumunda bir değer atamanıza olanak tanır.
durum [0, [1, 2, 3]] [a, [b, *c]]'de pa #=> 0
pb #=> 1
pc #=> [2, 3] sonudurum {a: 0, b: 1}
{a: 0, x: 1}'de
:kullanım dışı
{a: 0, b: var}'da
p var #=> 1
son - Etkileşimli hesaplamalar irb'nin (REPL, Read-Eval-Print-Loop) kabuğu artık okuma satırı uyumlu bir kitaplık kullanılarak uygulanan çok satırlı düzenleme özelliğine sahiptir , Ruby'de yazılmıştır. irb'de belirtilen sınıflar, modüller ve yöntemler hakkındaki referans bilgilerinin görüntülenmesine olanak tanıyan rdoc desteği entegre edilmiştir. Binding#irb aracılığıyla gösterilen kodlu satırların renkli vurgulanması ve temel sınıf nesnelerinin incelenmesinin sonuçları sağlanır.
- Bazı çok iş parçacıklı Ruby uygulamalarında meydana gelen bellek parçalanmasının neden olduğu performans ve bellek tüketimi sorunlarını çözerek, belleğin bir bölgesini birleştirebilen kompakt bir çöp toplayıcı (Sıkıştırma GC) eklendi. Yığındaki nesneleri paketlemek için Kullanılan bellek sayfalarının sayısını azaltmak ve yığını işlemler için optimize etmek için GC.compact yöntemi
CoW (yazarken kopyala). - Argümanları liste konumuna (“def foo(a,b,c)”) ve anahtar kelimelere (“def foo(key: val)”) göre ayırmaya hazırlanıyor. Anahtar kelimelere ve konuma dayalı otomatik bağımsız değişken dönüşümü kullanımdan kaldırılmıştır ve Ruby 3.0 dalında desteklenmeyecektir. Özellikle, son argümanın anahtar kelime parametreleri olarak kullanılması, anahtar kelimeye dayalı argümanların son karma parametresi olarak aktarılması ve son argümanın konumsal ve anahtar kelime parametrelerine bölünmesi kullanımdan kaldırılmıştır.
def foo(anahtar: 42); son; foo({key: 42}) # uyarıldı
def foo(**kw); son; foo({anahtar: 42}) #warned
def foo(anahtar: 42); son; foo(**{anahtar: 42}) # Tamam
def foo(**kw); son; foo(**{anahtar: 42}) # Tamamdef foo(h, **kw); son; foo(anahtar: 42) # uyarıldı
def foo(h, anahtar: 42); son; foo(anahtar: 42) # uyarıldı
def foo(h, **kw); son; foo({anahtar: 42}) # Tamam
def foo(h, anahtar: 42); son; foo({anahtar: 42}) # Tamamdef foo(h={}, anahtar: 42); son; foo("anahtar" => 43, anahtar: 42) # uyarıldı
def foo(h={}, anahtar: 42); son; foo({"anahtar" => 43, anahtar: 42}) # uyarıldı
def foo(h={}, anahtar: 42); son; foo({"anahtar" => 43}, anahtar: 42) # Tamamdef foo(opt={}); son; foo( tuş: 42 ) # Tamam
def foo(h, **nil); son; foo(anahtar: 1) #ArgumentError
def foo(h, **nil); son; foo(**{anahtar: 1}) # ArgumentError
def foo(h, **nil); son; foo("str" => 1) # ArgumentError
def foo(h, **nil); son; foo({anahtar: 1}) # Tamam
def foo(h, **nil); son; foo({"str" => 1}) # Tamamh = {}; def foo(*a) a end; foo(**h) # [] h = {}; def foo(a) a end; foo(**h) # {} ve uyarı
h = {}; def foo(*a) bir son; foo(h) # [{}] h = {}; def foo(a) bir son; foo(h) # {} - blok parametreleri için varsayılan olarak numaralı değişken adlarının kullanılması.
[1, 2, 3].her biri { @1 koyar } # gibi [1, 2, 3].her biri { |i| koyarım}
- Başlangıç değeri olmayan aralıklar için deneysel destek.
ary[..3] # ary[0..3] ile benzer rel.where(satışlar: ..100)
- Her öğenin kaç kez oluştuğunu sayan Enumerable#tally yöntemi eklendi.
["a", "b", "c", "b"].taklit
#=> {“a”=>1, “b”=>2, “c”=>1} - Kelimenin tam anlamıyla "self" ile özel bir yöntemin çağrılmasına izin verildi
kesinlikle foo
son
özel :foo
self.foo - Tembel (Enumerator::Lazy) numaralandırmadan düzenli numaralandırma oluşturmak için Enumerator::Lazy#eager yöntemi eklendi.
a = %w(foo bar baz)
e = a.tembel.harita {|x| x.upcase }.map {|x| x + "!" }.istekli
p e.sınıf #=> Numaralandırıcı
p e.harita {|x| x + "?" } #=> ["FOO!?", "BAR!?", "BAZ!?"] - Ruby dilindeki uygulamaların performansını önemli ölçüde artırabilecek deneysel bir JIT derleyicisinin geliştirilmesine devam edilmiştir. Ruby'nin JIT derleyicisi önce C kodunu diske yazar ve ardından makine talimatlarını oluşturmak için harici bir C derleyicisini çağırır (GCC, Clang ve Microsoft VC++ çağrısını destekler). Yeni sürüm, gerektiğinde satır içi dağıtım için bir yöntem uyguluyor, derleme sırasında optimizasyon modlarının seçici olarak uygulanması sağlanıyor, "--jit-min-calls" varsayılan değeri 5'ten 10000'e yükseltiliyor ve "--jit-max-" önbellek” 1000'den 100'e.
- CGI.escapeHTML, Monitor ve MonitorMixin'in performansı iyileştirildi.
- Modül#adı, true.to_s, false.to_s ve nil.to_s, belirtilen nesne için değişmeden bir dizenin döndürülmesini sağlar.
- RubyVM::InstructionSequence#to_binary yöntemi tarafından oluşturulan ikili dosyaların boyutu azaltıldı;
- Dahil olmak üzere yerleşik bileşenlerin güncellenmiş sürümleri
Paketleyici 2.1.2, RubyGems 3.1.2,
Racc 1.4.15,
CSV 3.1.2, REXML 3.2.3,
RSS 0.2.8,
StringScanner'ın 1.0.3; - Kütüphaneler temel paketten harici gem paketlerine taşındı
CMath (cmath mücevheri),
Scanf (scanf mücevheri),
Kabuk (kabuk taşı),
Senkronize edici (senkronizasyon taşı),
ThreadsWait (gecikme mücevheri),
E2MM (e2mmap mücevheri). - Varsayılan stdlib modülleri rubygems.org'da yayınlanmaktadır:
kalite Testi,
cgi,
temsilci,
getoptlong,
net pop,
net-smtp
açık3,
mağaza,
tekil. Monitör modülleri rubygems.org'a taşınmadı
gözlemci,
zaman aşımı,
izleyici,
nefret,
yaml, yalnızca ruby-core olarak sağlanır. - Ruby oluşturmak artık C99 standardını destekleyen bir C derleyicisi gerektiriyor.
Kaynak: opennet.ru
