Ruby dasturlash tilining chiqarilishi 2.7.0

Bir yillik rivojlanishdan keyin e'lon qilindi reliz Ruby 2.7.0, dastur ishlab chiqishda yuqori samaradorlik va Perl, Java, Python, Smalltalk, Eiffel, Ada va Lispning eng yaxshi xususiyatlarini o'zida mujassam etgan dinamik ob'ektga yo'naltirilgan dasturlash tili. Loyiha kodi BSD ("2-bandli BSDL") va "Ruby" litsenziyalari ostida tarqatiladi, bu GPL litsenziyasining so'nggi versiyasiga ishora qiladi va GPLv3 bilan to'liq mos keladi. Ruby 2.7 - bu rejalashtirilgan rivojlanish jarayonining bir qismi sifatida ishlab chiqarilgan ettinchi yirik reliz bo'lib, u xususiyatlarni yaxshilash uchun bir yil ajratish va 2-3 oylik yamoqlarni chiqarishni o'z ichiga oladi.

asosiy yaxshilanishlar:

  • eksperimental qo'llab-quvvatlash naqsh mosligi (Shakl mosligi) berilgan ob'ektni takrorlash va agar naqsh mos bo'lsa, qiymat belgilash.

    case [0, [1, 2, 3]] in [a, [b, *c]] pa #=> 0
    pb #=> 1
    kompyuter #=> [2, 3] oxiri

    hol {a: 0, b: 1}
    {a:0,x:1} ichida
    : erishib bo'lmaydi
    ichida {a: 0, b: var}
    p var #=> 1
    oxiri

  • irb interaktiv hisob-kitoblar qobig'i (REPL, Read-Eval-Print-Loop) endi ko'p qatorli tahrirlash imkoniyatiga ega bo'lib, ular o'qishga mos keladigan kutubxona yordamida amalga oshiriladi. qayta chiziqRuby tilida yozilgan. rdoc-ni qo'llab-quvvatlash integratsiya qilingan, bu irb-da belgilangan sinflar, modullar va usullar bo'yicha ma'lumotnoma ma'lumotlarini ko'rish imkonini beradi. Binding#irb orqali ko'rsatilgan kodli chiziqlarni rangli ta'kidlash va asosiy sinf ob'ektlarini tekshirish natijalari taqdim etiladi.

    Ruby dasturlash tilining chiqarilishi 2.7.0

  • Ba'zi ko'p tarmoqli Ruby ilovalari ishlashi paytida yuzaga keladigan xotira parchalanishi tufayli sekin ishlash va xotira sarfini oshirish muammolarini hal qiladigan, xotira hududini defragmentatsiya qilishni amalga oshiradigan ixcham axlat yig'uvchi (Compaction GC) qo'shildi. Ob'ektlarni uyaga yig'ish uchun taklif qildi GC.compact usuli ishlatilgan xotira sahifalari sonini kamaytirish va operatsiyalar uchun to'pni optimallashtirish
    Sigir (yozishda nusxa ko'chirish).

  • Amalga oshirildi; bajarildi ro'yxatdagi ("def foo(a,b,c)") va kalit so'zlar ("def foo(kalit: val)")dagi pozitsiyaga asoslangan argumentlarni ajratishga tayyorgarlik. Kalit so‘zlar va pozitsiyaga asoslangan argumentlarni avtomatik o‘zgartirish eskirgan va Ruby 3.0 filialida qo‘llab-quvvatlanmaydi. Xususan, oxirgi argumentni kalit so‘z parametrlari sifatida ishlatish, kalit so‘zga asoslangan argumentlarni oxirgi xesh parametri sifatida o‘tkazish va oxirgi argumentni pozitsion va kalit so‘z parametrlariga bo‘lish bekor qilingan.

    def foo (kalit: 42); oxiri; foo({kalit: 42}) #ogohlantirildi
    def foo(**kw); oxiri; foo({kalit: 42}) #ogohlantirildi
    def foo (kalit: 42); oxiri; foo(**{kalit: 42}) # OK
    def foo(**kw); oxiri; foo(**{kalit: 42}) # OK

    def foo(h, **kw); oxiri; foo(kalit: 42) #ogohlantirildi
    def foo(h, kalit: 42); oxiri; foo(kalit: 42) #ogohlantirildi
    def foo(h, **kw); oxiri; foo({kalit: 42}) # OK
    def foo(h, kalit: 42); oxiri; foo({kalit: 42}) # OK

    def foo(h={}, kalit: 42); oxiri; foo("key" => 43, kalit: 42) #ogohlantirildi
    def foo(h={}, kalit: 42); oxiri; foo({"key" => 43, kalit: 42}) # ogohlantirildi
    def foo(h={}, kalit: 42); oxiri; foo({"key" => 43}, kalit: 42) # OK

    def foo(opt={}); oxiri; foo( kalit: 42 ) # OK

    def foo(h, **nil); oxiri; foo (kalit: 1) # ArgumentError
    def foo(h, **nil); oxiri; foo(**{kalit: 1}) # ArgumentError
    def foo(h, **nil); oxiri; foo("str" ​​=> 1) # ArgumentError
    def foo(h, **nil); oxiri; foo({kalit: 1}) # OK
    def foo(h, **nil); oxiri; foo({"str" ​​=> 1}) # OK

    h = {}; def foo(*a) end; foo(**h) # [] h = {}; def foo(a) end; foo(**h) # {} va ogohlantirish
    h = {}; def foo(*a) end; foo(h) # [{}] h = {}; def foo(a) end; foo(h) # {}

  • imkoniyat blok parametrlari uchun sukut bo'yicha raqamlangan o'zgaruvchilar nomlaridan foydalanish.

    [1, 2, 3].har biri { @1 ni qo'yadi } # kabi [1, 2, 3].har biri { |i| qo'yadi men}

  • Boshlang‘ich qiymati bo‘lmagan diapazonlar uchun eksperimental yordam.

    ary[..3] # bilan bir xil ary[0..3] rel.where(sotish: ..100)

  • Har bir element necha marta sodir bo'lishini hisoblaydigan Enumerable#tally usuli qo'shildi.

    ["a", "b", "c", "b"].tall
    #=> {"a"=>1, "b"=>2, "c"=>1}

  • Shaxsiy usul chaqiruviga "self" harfi bilan ruxsat beriladi

    deffoo
    oxiri
    shaxsiy: foo
    self.foo

  • Lazy (Enumerator::Lazy) ro'yxatidan muntazam ro'yxat yaratish uchun qo'shilgan Enumerator::Lazy#eager usuli.

    a = %w(foo bar baz)
    e = a.dangasa.xarita {|x| x.upcase }.map {|x| x + "!" }.ishtiyoqli
    p e.class #=> Hisoblagich
    e.xarita {|x| x + "?" } #=> [“FOO!?”, “BAR!?”, “BAZ!?”]

  • Eksperimental JIT kompilyatorini ishlab chiqish davom etdi, bu Ruby tilidagi ilovalarning ishlashini sezilarli darajada yaxshilaydi. Ruby-da taklif qilingan JIT kompilyatori dastlab diskga C kodini yozadi, so'ngra u mashina ko'rsatmalarini yaratish uchun tashqi C kompilyatorini chaqiradi (GCC, Clang va Microsoft VC ++ qo'llab-quvvatlanadi). Yangi versiya, agar kerak bo'lsa, inline joylashtirish usulini amalga oshiradi, kompilyatsiya paytida optimallashtirish rejimlarini tanlab qo'llaydi, "--jit-min-calls" standart qiymati 5 dan 10000 gacha oshiriladi va "--jit-max-kesh" 1000 dan 100 gacha.
  • CGI.escapeHTML, Monitor va MonitorMixinning yaxshilangan ishlashi.
  • Module#name, true.to_s, false.to_s va nil.to_s belgilangan ob'ekt uchun o'zgarmagan satr qaytarilishini ta'minlaydi.
  • RubyVM::InstructionSequence#to_binary usuli bilan yaratilgan ikkilik fayllar hajmi qisqartirildi;
  • O'rnatilgan komponentlarning yangilangan versiyalari, shu jumladan
    Bundler 2.1.2, RubyGems 3.1.2,
    Racc 1.4.15,
    CSV 3.1.2, REXML 3.2.3,
    RSS 0.2.8,
    String Scanner 1.0.3;

  • Kutubxonalar asosiy tarqatishdan tashqi qimmatbaho toshlar paketlariga o'tdi
    CMath (qimmatli tosh),
    Scanf (scanf gem),
    Shell (qobiq marvarid),
    Sinxronizator (sinxronlash marvaridlari),
    ThreadsWait (kuting marvarid),
    E2MM (e2mmap marvarid).

  • Standart stdlib modullari rubygems.org saytida nashr etilgan:
    benchmark,
    cgi,
    delegat,
    getoptlong,
    net pop,
    net smtp,
    ochiq3,
    pstore,
    singleton. Monitor modullari rubygems.org saytiga ko'chirilmadi
    kuzatuvchi,
    taym-aut; turib qolish; tanaffus,
    kuzatuvchi,
    uri,
    yaml, ular faqat ruby-yadro bilan jo'natiladi.

  • Ruby Building endi C99 standartini qo'llab-quvvatlaydigan C kompilyatorini talab qiladi.

Manba: opennet.ru

a Izoh qo'shish