Rilis bahasa pemrograman Ruby 2.7.0

Setelah satu tahun pembangunan diterbitkan melepaskan Ruby 2.7.0, bahasa pemrograman berorientasi objek dinamis yang sangat efisien dalam pengembangan program dan menggabungkan fitur terbaik Perl, Java, Python, Smalltalk, Eiffel, Ada dan Lisp. Kode proyek didistribusikan di bawah lisensi BSD ("2-clause BSDL") dan "Ruby", yang mengacu pada versi terbaru lisensi GPL dan sepenuhnya kompatibel dengan GPLv3. Ruby 2.7 adalah rilis besar ketujuh yang diproduksi sebagai bagian dari proses pengembangan terencana yang mencakup penyisihan satu tahun untuk peningkatan fitur dan rilis patch 2-3 bulan.

Utama perbaikan:

  • eksperimental mendukung pencocokan pola (Pencocokan pola) untuk mengulangi objek tertentu dan memberikan nilai jika ada pola yang cocok.

    kasus [0, [1, 2, 3]] di [a, [b, *c]] pa #=> 0
    hal #=> 1
    pc #=> [2, 3] selesai

    kasus {a: 0, b: 1}
    dalam{a:0,x:1}
    : tidak dapat dijangkau
    dalam {a: 0, b: var}
    p var #=> 1
    akhir

  • Shell perhitungan interaktif irb (REPL, Read-Eval-Print-Loop) sekarang memiliki kemungkinan pengeditan multi-baris, diimplementasikan menggunakan perpustakaan yang kompatibel dengan readline garis ulangditulis dalam Ruby. Dukungan untuk rdoc telah terintegrasi, yang memungkinkan melihat informasi referensi tentang kelas, modul, dan metode tertentu di irb. Sorotan berwarna pada baris dengan kode yang ditunjukkan melalui Binding#irb dan hasil pemeriksaan objek kelas dasar disediakan.

    Rilis bahasa pemrograman Ruby 2.7.0

  • Menambahkan pengumpul sampah kompak (Compaction GC) yang dapat mendefrag suatu wilayah memori, memecahkan masalah kinerja lambat dan peningkatan konsumsi memori karena fragmentasi memori yang terjadi selama pengoperasian beberapa aplikasi Ruby multi-thread. Untuk mengemas objek di heap diajukan Metode GC.compact untuk mengurangi jumlah halaman memori yang digunakan dan mengoptimalkan heap untuk operasi
    Kontrak Karya (copy-on-write).

  • Dilakukan bersiap untuk memisahkan argumen berdasarkan posisi dalam daftar ("def foo(a,b,c)") dan kata kunci ("def foo(key: val)"). Konversi argumen otomatis berdasarkan kata kunci dan posisi sudah tidak digunakan lagi dan tidak akan didukung di cabang Ruby 3.0. Secara khusus, penggunaan argumen terakhir sebagai parameter kata kunci, meneruskan argumen berbasis kata kunci sebagai parameter hash terakhir, dan membagi argumen terakhir menjadi parameter posisi dan kata kunci sudah tidak digunakan lagi.

    def foo(kunci: 42); akhir; foo({kunci: 42}) #diperingatkan
    def foo(**kw); akhir; foo({kunci: 42}) #diperingatkan
    def foo(kunci: 42); akhir; foo(**{kunci: 42}) # Oke
    def foo(**kw); akhir; foo(**{kunci: 42}) # Oke

    def foo(h, **kw); akhir; foo(kunci: 42) #diperingatkan
    def foo(h, kunci: 42); akhir; foo(kunci: 42) #diperingatkan
    def foo(h, **kw); akhir; foo({kunci: 42}) # Oke
    def foo(h, kunci: 42); akhir; foo({kunci: 42}) # Oke

    def foo(h={}, kunci: 42); akhir; foo("kunci" => 43, kunci: 42) #diperingatkan
    def foo(h={}, kunci: 42); akhir; foo({"kunci" => 43, kunci: 42}) # diperingatkan
    def foo(h={}, kunci: 42); akhir; foo({"kunci" => 43}, kunci: 42) # OK

    def foo(memilih={}); akhir; foo( kunci: 42 ) # OK

    def foo(h, **nihil); akhir; foo(kunci: 1) # ArgumentError
    def foo(h, **nihil); akhir; foo(**{kunci: 1}) # ArgumentError
    def foo(h, **nihil); akhir; foo("str" ​​=> 1) #ArgumentError
    def foo(h, **nihil); akhir; foo({kunci: 1}) # Oke
    def foo(h, **nihil); akhir; foo({"str" ​​=> 1}) # Oke

    jam = {}; def foo(*a) akhir; foo(**h) # [] h = {}; def foo(a) akhir; foo(**h) # {} dan peringatan
    jam = {}; def foo(*a) akhir; foo(h) # [{}] h = {}; def foo(a) akhir; foo(h) # {}

  • Kesempatan menggunakan nama variabel default bernomor untuk parameter blok.

    [1, 2, 3].setiap { menempatkan @1 } # suka [1, 2, 3].setiap { |i| menempatkan saya }

  • Dukungan eksperimental untuk rentang tanpa nilai awal.

    ary[..3] # sama dengan ary[0..3] rel.where(penjualan: ..100)

  • Menambahkan metode Enumerable#tally, yang menghitung berapa kali setiap elemen muncul.

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

  • Panggilan metode pribadi diperbolehkan dengan literal "mandiri".

    defoo
    akhir
    pribadi :foo
    diri.foo

  • Menambahkan metode Enumerator::Lazy#eager untuk menghasilkan enumerasi reguler dari enumerasi malas (Enumerator::Lazy).

    a = %w(foo bar baz)
    e = a.malas.peta {|x| x.upcase }.peta {|x| x + "!" }.ingin sekali
    p e.class #=> Enumerator
    e.peta {|x| x + "?" } #=> [β€œFOO!?”, β€œBAR!?”, β€œBAZ!?”]

  • Pengembangan kompiler JIT eksperimental terus berlanjut, yang secara signifikan dapat meningkatkan kinerja aplikasi dalam bahasa Ruby. Kompiler JIT yang diusulkan di Ruby pertama-tama menulis kode C ke disk, setelah itu memanggil kompiler C eksternal untuk menghasilkan instruksi mesin (mendukung GCC, Clang, dan Microsoft VC++). Versi baru mengimplementasikan metode penerapan inline jika diperlukan, penerapan mode optimasi secara selektif selama kompilasi, nilai default "--jit-min-calls" ditingkatkan dari 5 menjadi 10000, dan "--jit-max-cache" dari 1000 hingga 100.
  • Peningkatan kinerja CGI.escapeHTML, Monitor dan MonitorMixin.
  • Module#name, true.to_s, false.to_s, dan nil.to_s memastikan bahwa string yang dikembalikan tidak berubah untuk objek yang ditentukan.
  • Ukuran file biner yang dihasilkan oleh metode RubyVM::InstructionSequence#to_binary telah dikurangi;
  • Versi terbaru dari komponen bawaan, termasuk
    Bundel 2.1.2, RubyGems 3.1.2,
    Racc 1.4.15,
    CSV 3.1.2, REXML 3.2.3,
    RSS 0.2.8,
    Pemindai String 1.0.3;

  • Perpustakaan berpindah dari distribusi dasar ke paket permata eksternal
    CMath (permata cmath),
    Scanf (permata pemindaian),
    Cangkang (permata cangkang),
    Sinkronisasi (permata sinkronisasi),
    ThreadsWait (menunggu permata),
    E2MM (permata peta e2mm).

  • Modul stdlib default dipublikasikan di rubygems.org:
    patokan,
    cgi,
    melimpahkan,
    dapatkan panjang,
    pop bersih,
    smtp bersih,
    buka3,
    ptoko,
    lajang. Modul monitor tidak dipindahkan ke rubygems.org
    pengamat,
    waktu habis,
    pengusut,
    benci,
    yaml, yang hanya dikirimkan dengan ruby-core.

  • Membangun Ruby sekarang memerlukan kompiler C yang mendukung standar C99.

Sumber: opennet.ru

Tambah komentar