Ruby 3.0.0 Preview 1 Dirilis

Kami dengan senang hati mengumumkan rilis dari Ruby 3.0.0-preview1.

Rilis ini mengenalkan sejumlah fitur baru dan perbaikan performa.

RBS

RBS adalah sebuah bahasa yang mendeskripsikan tipe dari program Ruby. Type checker termasuk type-profiler dan tool lainnya yang mendukung RBS akan memahami program Ruby jauh lebih baik dengan definisi RBS.

Anda dapat menuliskan definisi class dan module: method didefinisikan di dalam class, instance variables dan tipenya, serta hubungan inheritance/mix-in. RBS memiliki tujuan untuk mendukung pola yang biasanya kita lihat dalam program Ruby dan memperbolehkan penulisan advanced types yang berisi union type, method overloading, dan generic. RBS juga mendukung duck typing dengan interface types.

Ruby 3.0 dirilis dengan gem rbs, yang memperbolehkan untuk mem-parse dan memproses definisi tipe yang ditulis di dalam RBS.

Berikut ini adalah sebuah contoh kecil dari RBS.

module ChatApp
  VERSION: String

  class Channel
    attr_reader name: String
    attr_reader messages: Array[Message]
    attr_reader users: Array[User | Bot]              # `|` berarti union types, `User` atau `Bot`.

    def initialize: (String) -> void

    def post: (String, from: User | Bot) -> Message   # Method overloading didukung.
            | (File, from: User | Bot) -> Message
  end
end

Lihat README dari gem rbs untuk lebih detail.

Ractor (eksperimental)

Ractor adalah sebuah Actor-model seperti concurrent abstraction yang didesain untuk menyediakan sebuah fitur eksekusi paralel tanpa mengkhawatirkan thread-safety.

Anda dapat membuat beberapa ractor dan menjalankannya secara paralel. Ractor memungkinkan untuk membuat program paralel yang thread-safe karena ractor tidak dapat membagi objek normal. Komunikasi antar ractor didukung oleh message passing.

Untuk membatasi pembagian objek, Ractor mengenalkan beberapa batasan pada sintaks Ruby (tanpa banyak Ractor, maka tidak ada perubahan).

Spesifikasi dan implementasi dari Ractor masih belum sempurna dan memungkinkan adanya perubahan ke depan, sehingga fitur ini ditandai dengan eksperimental dan peringatan fitur eksperimental akan ditampilkan ketika Ractor dibuat.

Berikut adalah program kecil yang mengecek prime? secara paralel dengan dua ractor dan memiliki kecepatan 2 kali lebih cepat dengan dua atau lebih core dibanding program sequential.

require 'prime'

# n.prime? dengan integer r1, r2 jalan secara paralel
r1, r2 = *(1..2).map do
  Ractor.new do
    n = Ractor.recv
    n.prime?
  end
end

# parameter dikirim
r1.send 2**61 - 1
r2.send 2**61 + 15

# menunggu hasil dari expr1, expr2
p r1.take #=> true
p r2.take #=> true

Lihat doc/ractor.md untuk lebih detail.

Scheduler (eksperimental)

Thread#scheduler diperkenalkan untuk menghalangi operasi blocking. Ini memperbolehkan light-weight concurrency tanpa pengubahan kode yang sudah ada.

Saat ini, class/method yang didukung:

  • Mutex#lock, Mutex#unlock, Mutex#sleep
  • ConditionVariable#wait
  • Queue#pop, SizedQueue#push
  • Thread#join
  • Kernel#sleep
  • IO#wait, IO#read, IO#write dan method yang berkaitan (seperti #wait_readable, #gets, #puts dan lainnya).
  • IO#select tidak didukung.

Titik masuk dari concurrency saat ini adalah Fiber.schedule{...}, namun ini dapat berubah sewaktu-waktu ketika Ruby 3 dirilis.

Sekarang, ada sebuah test scheduler yang tersedia di Async::Scheduler. Lihat doc/scheduler.md untuk lebih detail. [Feature #16786]

PERINGATAN: Fitur ini masih eksperimental. Baik nama maupun fitur akan berubah pada rilis preview berikutnya.

Fitur Baru Lainnya

  • Rightward assignment statement ditambahkan.

    fib(10) => x
    p x #=> 55
    
  • Definisi endless method ditambahkan.

    def square(x) = x * x
    
  • Find pattern ditambahkan.

    case ["a", 1, "b", "c", 2, "d", "e", "f", 3]
    in [*pre, String => x, String => y, *post]
      p pre  #=> ["a", 1]
      p x    #=> "b"
      p y    #=> "c"
      p post #=> [2, "d", "e", "f", 3]
    end
    
  • Hash#except sekarang built-in.

    h = { a: 1, b: 2, c: 3 }
    p h.except(:a) #=> {:b=>2, :c=>3}
    
  • Memory view ditambahkan sebagai sebuah fitur eksperimental

    • Ini adalah sebuah kumpulan C-API baru yang menukar sebuah area raw memory, seperti sebuah numeric array dan sebuah bitmap image, antara pustaka extension. Pustaka extension dapat juga membagikan metadata dari area memory yang terdiri dari bentuk, format elemen, dan sebagainya. Menggunakan semacam metadata seperti ini, pustaka extension bahkan dapat membagikan sebuah multidimensional array dengan tepat. Fitur ini didesain dengan merujuk pada buffer protocol dari Python.

Perbaikan performa

  • Banyak perbaikan yang telah diimplementasikan dalam MJIT. Lihat NEWS untuk detail.

Perubahan penting lainnya sejak 2.7

  • Keyword argument dipisahkan dari argument lainnya.
    • Pada dasarnya, kode yang mencetak sebuah peringatan pada Ruby 2.7 tidak akan bekerja. Lihat dokumen untuk detail.
    • Omong-omong, argument forwarding sekarang mendukung leading argument.

      def method_missing(meth, ...)
        send(:"do_#{ meth }", ...)
      end
      
  • Fitur $SAFE telah dihilangkan; sekarang adalah sebuah variabel global.

  • Urutan dari backtrace telah dibalik pada Ruby 2.5, tetapi itu dibatalkan. Sekarang urutan berperilaku seperti Ruby 2.4; pesan error dan nomor baris di mana exception terjadi dicetak terlebih dahulu dan pemanggilnya baru dicetak kemudian.

  • Beberapa pustaka standar yang diperbarui.
    • RubyGems 3.2.0.rc.1
    • Bundler 2.2.0.rc.1
    • IRB 1.2.6
    • Reline 0.1.5
  • Berikut adalah pustaka yang tidak lagi masuk sebagai bundled gem. Pasang gem berikut jika ingin menggunakan fiturnya.
    • net-telnet
    • xmlrpc
  • Memindahkan default gem ke bundled gem.
    • rexml
    • rss
  • Memindahkan stdlib ke default gem. Berikut adalah default gem yang telah dipublikasikan ke rubygems.org
    • abbrev
    • base64
    • English
    • erb
    • find
    • io-nonblock
    • io-wait
    • net-ftp
    • net-http
    • net-imap
    • net-protocol
    • nkf
    • open-uri
    • optparse
    • resolv
    • resolv-replace
    • rinda
    • securerandom
    • set
    • shellwords
    • tempfile
    • time
    • tmpdir
    • tsort
    • weakref

Lihat NEWS atau commit logs untuk lebih detail.

Dengan perubahan tersebut, 3385 berkas berubah, 150159 sisipan(+), 124949 terhapus(-) sejak Ruby 2.7.0!

Mohon coba Ruby 3.0.0-preview1 dan berikan kami umpan balik!

Unduh

  • https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0-preview1.tar.bz2

    SIZE: 15538340
    SHA1: 032697f3ace0a697cd72f68bac0032c31a8328d4
    SHA256: 013bdc6e859d76d67a6fcd990d401ed57e6e25896bab96d1d0648a877f556dbb
    SHA512: 3a6a6458d9c5f06555ab8705160f6b071f4dbe9d2a91cd7848852633657b495c480d74e4b2ff2cebddda556118d26bbb271160c989bc970bb1b5cb234e868d2f
    
  • https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0-preview1.tar.gz

    SIZE: 17747808
    SHA1: 2842d2af2568d74c8d4071f5f536889a6b149202
    SHA256: ce8bd7534e7ec2a870b24d2145ea20e9bbe5b2d76b7dfa1102dbee5785253105
    SHA512: b94892951f842a1538f4b99022606ac2c0b5031f1ede7eef3833a8caa9ed63e9b22868509173bfefb406f263c65211db75597b152b61f49e5ba2a875fce63a27
    
  • https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0-preview1.tar.xz

    SIZE: 12703060
    SHA1: 91d9fbe87504924148deeec90199d6ff4d7dcf56
    SHA256: aa7cce0c99f4ea2145fef9b78d74a44857754396790cd23bad75d759811e7a2a
    SHA512: dca5dcc965c434371947c100864090e29e649e19ae24b8bb2e88a534ebd8220c5a086035a999b1e8b1cd5ec154a6985a8d8dfea56095d712d62aeea7a2054f7d
    
  • https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0-preview1.zip

    SIZE: 22002645
    SHA1: 4b5b61066373daf0a947d3fafe2645788504a164
    SHA256: a39a48ed9a8ca2c83d65d225a1bb3db331c6587a77ba156c20e630c1b4bfc23b
    SHA512: 10f6f28715a52093d7d9da82d1678147091b45e2f279e463626adea8efbf181485daa42565e5086057ffb45a097ffb8ff395c572b247b6b5da27d85933cf58a8
    

Cuplikan 3.0.0-preview2

Kami merencanakan untuk memasukkan “type-profiler” yang mana adalah sebuah fitur analisis static type. Nantikan!

Apa itu Ruby

Ruby pertama kali dikembangkan oleh Matz (Yukihiro Matsumoto) pada 1993 dan sekarang dikembangkan sebagai Open Source. Ruby berjalan di berbagai jenis platform dan digunakan di seluruh dunia khususnya pengembangan web.