Ruby 3.0.0-preview1'in yayınlandığını duyurmaktan memnuniyet duyuyoruz.

Bu sürüm birçok yeni özellik ve performans iyileştirmesi içermektedir.

## RBS

RBS, Ruby programlarındaki tipleri tanımlamada kullanılan bir dildir.
RBS'yi destekleyen tip kontrol edicileri (tip profil oluşturucuları da dahil) ve diğer araçlar, RBS tanımlamaları ile birlikte Ruby programlarını çok daha iyi anlayacaklardır.

RBS ile sınıfların ve modüllerin tanımını yazabilirsiniz: bir sınıfta tanımlanmış metodlar, örnek değişkenleri ve bu değişkenlerin tipleri, ve miras/mix-in ilişkisi.
RBS'nin amacı Ruby programlarında sıkça görülen desenleri desteklemektir.
RBS, union tiplerinin de dahil olduğu gelişmiş tipleri, metod aşırı yüklemeyi, ve genelleyicileri yazmaya izin verir.
Ayrıca _arayüz tipleri_ ile ördek tiplemesini de destekler.

Ruby 3.0 `rbs` gem'i ile gelmektedir, bu gem RBS ile yazılmış tip tanımlarını ayrıştırma ve işlemeye izin verir.

Aşağıdaki kod RBS için küçük bir örnektir.

``` rbs
module ChatApp
  VERSION: String

  class Channel
    attr_reader name: String
    attr_reader messages: Array[Message]
    attr_reader users: Array[User | Bot]              # `|`, union tip anlamına gelmektedir, `User` ya da `Bot`.

    def initialize: (String) -> void

    def post: (String, from: User | Bot) -> Message   # Metod aşırı yükleme destekleniyor.
            | (File, from: User | Bot) -> Message
  end
end
```

Daha fazla ayrıntı için [rbs gem'inin README](https://github.com/ruby/rbs)'sine bakınız.

## Ractor (deneysel)

Ractor, thread güvenliği endişeleri olmadan paralel çalıştırma özelliğini sağlamak için tasarlanan eşzamanlı soyutlama gibi bir aktör-modeldir.

Birden fazla ractor yapabilirsiniz ve bunları paralelde çalıştırabilirsiniz.
Ractor thread-güvenli paralel programlar yapmanıza izin verir çünkü ractor'lar normal nesneleri paylaşmazlar.
Ractor'lar arasındaki iletişim mesaj geçirme ile desteklenir.

Nesnelerin paylaşılmasını kısıtlamak için Ractor, Ruby'nin sözdizimine bazı kısıtlamalar getirir (birden fazla Ractor yoksa, değişiklik yoktur).

Belirtim ve gerçekleme henüz tam oturmamıştır ve ileride değişecektir, bu sebeple bu özellik deneysel olarak işaretlenmiştir ve eğer bir Ractor oluşturulursa, deneysel özellik uyarısı gösterilir.

Aşağıdaki küçük program `prime?`'ı iki ractor ile paralelde hesaplar ve iki ya da daha fazla çekirdekte ardışık bir programa göre aşağı yukarı 2 kat daha hızlıdır.

``` ruby
require 'prime'

# r1 ve r2'deki, tamsayıların gönderildiği n.prime? paralelde çalışır
r1, r2 = *(1..2).map do
  Ractor.new do
    n = Ractor.recv
    n.prime?
  end
end

# parametreleri gönder
r1.send 2**61 - 1
r2.send 2**61 + 15

# 1. ve 2. deyimin sonuçlarını bekle
p r1.take #=> true
p r2.take #=> true
```

Daha fazla ayrıntı için [doc/ractor.md](https://github.com/ruby/ruby/blob/master/doc/ractor.md)'ye bakınız.

## Zamanlayıcı (Deneysel)

`Thread#scheduler` bloklayan işlemleri kesmek için tanıtılmıştır.
Bu, var olan kodu değiştirmeden hafif eşzamanlılığa izin verir.

Şu anda desteklenen sınıf ve metodlar:

- `Mutex#lock`, `Mutex#unlock`, `Mutex#sleep`
- `ConditionVariable#wait`
- `Queue#pop`, `SizedQueue#push`
- `Thread#join`
- `Kernel#sleep`
- `IO#wait`, `IO#read`, `IO#write` ve ilişkili metodlar (yani `#wait_readable`, `#gets`, `#puts` vb.).
- `IO#select` *desteklenmemektedir*.

Eşzamanlılık için şu anki giriş noktası `Fiber.schedule{...}`'dır, fakat Ruby 3 yayınlandığı zaman bu durum değişebilir.

Şu anda [`Async::Scheduler`](https://github.com/socketry/async/pull/56)'da bir test zamanlayıcısı vardır.
Daha fazla ayrıntı için [`doc/scheduler.md`](https://github.com/ruby/ruby/blob/master/doc/scheduler.md)'ye bakınız. [Özellik #16786]

**DİKKAT**: Bu özellik deneyseldir.
İsim de özellik de sonraki önizleme sürümlerinde değişecektir.

## Diğer Dikkate Değer Yeni Özellikler

* Sağ atama ifadesi eklendi.

  ``` ruby
  fib(10) => x
  p x #=> 55
  ```

* Sonsuz metod tanımı eklendi.

  ``` ruby
  def square(x) = x * x
  ```

* Bulma deseni eklendi.

  ``` ruby
  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` şimdi gömülü.

  ``` ruby
  h = { a: 1, b: 2, c: 3 }
  p h.except(:a) #=> {:b=>2, :c=>3}
  ```

* Hafıza görünümü deneysel bir özellik olarak eklendi.

    * Bu, uzantı kütüphaneleri arasında sayısal bir dizi ve bir biteşlem görüntüsü gibi ham bir hafıza alanını takas etmek için yeni bir C-API'ıdır.
    Uzantı kütüphaneleri ayrıca şekil, öğe biçimi, vb. içeren hafıza alanlarının üstverilerini de paylaşır.
    Bu gibi üstverileri kullanarak, uzantı kütüphaneleri çok boyutlu dizileri bile uygun şekilde paylaşabilirler.
    Bu özellik Python'ın tampon protokolüne danışılarak tasarlanmıştır.

## Performans iyileştirmeleri

* Birçok geliştirme MJIT'te gerçeklenmiştir.
Ayrıntılar için NEWS'e bakınız.

## 2.7'den bu yana diğer dikkate değer değişiklikler

* Anahtar sözcük argümanları diğer argümanlardan ayrılmıştır.
  * Prensipte, Ruby 2.7'de bir uyarı yazdıran kod çalışmayacaktır.
  Ayrıntılar için [belgeye](https://www.ruby-lang.org/tr/news/2019/12/12/separation-of-positional-and-keyword-arguments-in-ruby-3-0/) bakınız.
  * Bu arada argüman yönlendirme artık sondaki argümanları da destekliyor.

    ``` ruby
    def method_missing(meth, ...)
      send(:"do_#{ meth }", ...)
    end
    ```

* `$SAFE` özelliği tamamiyle silindi; şimdi sadece normal bir global değişken.

* Geriizleme sırası Ruby 2.5'te tersine çevrildi, fakat bu iptal edildi.
Şimdi Ruby 2.4'teki gibi bir davranış söz konusu; hata mesajı ve istisnanın meydana geldiği satır numarası ilk olarak yazdırılır, daha sonra ise çağırıcıları yazdırılır.

* Bazı standart kütüphaneler güncellendi.
  * RubyGems 3.2.0.rc.1
  * Bundler 2.2.0.rc.1
  * IRB 1.2.6
  * Reline 0.1.5

* Aşağıdaki kütüphaneler artık paketlenmiyor.
Bu özellikleri kullanmak için denk gelen gem'leri kurun.
  * net-telnet
  * xmlrpc

* Şu varsayılan gem'ler paketlenmiş gem'ler olarak düzenlendi.
  * rexml
  * rss

* stdlib varsayılan gemler olarak düzenlendi.
Aşağıdaki varsayılan gem'ler rubygems.org'da yayınlandı.
  * 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

Daha fazla ayrıntı için [NEWS](https://github.com/ruby/ruby/blob/v3_0_0_preview1/NEWS.md)'e ya da [işleme loglarına](https://github.com/ruby/ruby/compare/v2_7_0...v3_0_0_preview1) bakınız.



Bu değişikliklerle birlikte, 2.7.0'dan bu yana [3385 dosya değişti, 150159 ekleme(+) yapıldı, 124949 silme(-) yapıldı](https://github.com/ruby/ruby/compare/v2_7_0...v3_0_0_preview1)!

Lütfen Ruby 3.0.0-preview1'i deneyin, ve bize herhangi bir geri bildirim verin!

## İndirin

* <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

## 3.0.0-preview2 tanıtımı

Bir statik tip ayrıştırması özelliği olan ["type-profiler"](https://github.com/mame/ruby-type-profiler)'ı dahil etmeyi düşünüyoruz.
Takipte kalın!

## Ruby nedir

Ruby ilk olarak Matz (Yukihiro Matsumoto) tarafından 1993'te geliştirilmiştir, ve şu anda Açık Kaynak olarak geliştirilmektedir.
Birçok platformda çalışır ve tüm dünyada genellikle web geliştirmesi için kullanılır.
