|
| 1 | +--- |
| 2 | +layout: news_post |
| 3 | +title: "Ruby 2.7.0-preview2 Dirilis" |
| 4 | +author: "naruse" |
| 5 | +translator: "meisyal" |
| 6 | +date: 2019-10-22 12:00:00 +0000 |
| 7 | +lang: id |
| 8 | +--- |
| 9 | + |
| 10 | +Kami dengan senang hati mengumumkan rilis dari Ruby 2.7.0-preview2. |
| 11 | + |
| 12 | +Sebuah versi *preview* dirilis untuk mengumpulkan umpan balik rilis final |
| 13 | +yang direncanakan rilis pada bulan Desember. Versi ini memperkenalkan |
| 14 | +sejumlah fitur baru dan perbaikan performa, terutama: |
| 15 | + |
| 16 | +* Compaction GC |
| 17 | +* Pattern Matching |
| 18 | +* REPL improvement |
| 19 | +* Separation of positional and keyword arguments |
| 20 | + |
| 21 | +## Compaction GC |
| 22 | + |
| 23 | +Rilis ini memperkenalkan *Compaction* GC yang dapat *defragment* sebuah |
| 24 | +*fragmented memory space*. |
| 25 | + |
| 26 | +Beberapa *multi-threaded* dari program Ruby dapat menyebabkan *memory |
| 27 | +fragmentation*, menyebabkan penggunaan *memory* tinggi dan penurunan kecepatan. |
| 28 | + |
| 29 | +*Method* `GC.compact` dikenalkan untuk me-*compact heap*. Fungsi ini |
| 30 | +me-*compact* objek di dalam *heap* sehingga sedikit *page* yang akan digunakan |
| 31 | +dan *heap* bisa jadi lebih CoW bersahabat. [[Feature #15626]](https://bugs.ruby-lang.org/issues/15626) |
| 32 | + |
| 33 | +## Pattern Matching [Experimental] |
| 34 | + |
| 35 | +*Pattern matching*, fitur yang banyak digunakan dalam bahasa pemrograman |
| 36 | +fungsional, dikenalkan sebagai sebuah fitur eksperimental. [[Feature #14912]](https://bugs.ruby-lang.org/issues/14912) |
| 37 | +Ini dapat melewati sebuah objek dan menetapkan nilainya jika cocok dengan |
| 38 | +sebuah pola. |
| 39 | + |
| 40 | +```ruby |
| 41 | +case JSON.parse('{...}', symbolize_names: true) |
| 42 | +in {name: "Alice", children: [{name: "Bob", age: age}]} |
| 43 | + p age |
| 44 | + ... |
| 45 | +end |
| 46 | +``` |
| 47 | + |
| 48 | +Untuk lebih detail, mohon lihat [Pattern matching - New feature in Ruby 2.7](https://speakerdeck.com/k_tsj/pattern-matching-new-feature-in-ruby-2-dot-7). |
| 49 | + |
| 50 | +## REPL improvement |
| 51 | + |
| 52 | +`irb`, membungkus *interactive development* (REPL; Read-Eval-Print-Loop), |
| 53 | +sekarang mendukung suntingan *multi-line*. Ini didukung oleh `reline`, |
| 54 | +`readline` yang sesuai dengan implementasi murni dari Ruby. Ini juga |
| 55 | +menyediakan integrasi rdoc. Di dalam `irb` Anda dapat menampilkan referensi |
| 56 | +sebuah *class*, *module*, atau *method*. [[Feature #14683]](https://bugs.ruby-lang.org/issues/14683), [[Feature #14787]](https://bugs.ruby-lang.org/issues/14787), [[Feature #14918]](https://bugs.ruby-lang.org/issues/14918) |
| 57 | +Selain itu, baris kode ditampilkan pada `binding.irb` dan hasil pemeriksaan |
| 58 | +objek *core-class* sekarang berwarna. |
| 59 | + |
| 60 | +<video autoplay="autoplay" controls="controls" muted="muted" width="576" height="259"> |
| 61 | + <source src="https://cache.ruby-lang.org/pub/media/irb_improved_with_key_take2.mp4" type="video/mp4"> |
| 62 | +</video> |
| 63 | + |
| 64 | +## Separation of positional and keyword arguments |
| 65 | + |
| 66 | +Konversi otomatis dari *keyword argument* dan *positional argument* sudah |
| 67 | +usang dan akan dihapus di Ruby 3. [[Feature #14183]](https://bugs.ruby-lang.org/issues/14183) |
| 68 | + |
| 69 | +* Ketika sebuah pemanggilan *method* melewati sebuah *Hash* pada *argument* |
| 70 | + terakhir, ketika melewati *keyword* kosong, dan ketika *method* yang |
| 71 | + dipanggil menerima *keyword*, sebuah peringatan dikeluarkan. Untuk |
| 72 | + melanjutkan sebagai *keyword*, menambahkan sebuah *double splat operator* |
| 73 | + untuk menghindari peringatan dan memastikan perilaku yang benar pada Ruby 3. |
| 74 | + |
| 75 | + |
| 76 | + ```ruby |
| 77 | + def foo(key: 42); end; foo({key: 42}) # warned |
| 78 | + def foo(**kw); end; foo({key: 42}) # warned |
| 79 | + def foo(key: 42); end; foo(**{key: 42}) # OK |
| 80 | + def foo(**kw); end; foo(**{key: 42}) # OK |
| 81 | + ``` |
| 82 | +
|
| 83 | +* Ketika sebuah pemanggilan *method* melewati *keyword* ke sebuah *method* |
| 84 | + yang menerima *keyword*, tetapi tidak memenuhi *positional argument* yang |
| 85 | + diperlukan, *keyword* akan dianggap sebagai sebuah *required positional |
| 86 | + argument* final dan sebuah peringatan dikeluarkan. Melewati *argument* |
| 87 | + sebagai sebuah *hash* ketimbang *keyword* untuk menghindari peringatan dan |
| 88 | + memastikan perilaku yang benar pada Ruby 3. |
| 89 | +
|
| 90 | + ```ruby |
| 91 | + def foo(h, **kw); end; foo(key: 42) # warned |
| 92 | + def foo(h, key: 42); end; foo(key: 42) # warned |
| 93 | + def foo(h, **kw); end; foo({key: 42}) # OK |
| 94 | + def foo(h, key: 42); end; foo({key: 42}) # OK |
| 95 | + ``` |
| 96 | +
|
| 97 | +* Ketika sebuah *method* menerima *keyword* tertentu, tetapi bukan sebuah |
| 98 | + *keyword splat* dan sebuah *hash* atau *keyword splat* dilewatkan *method* |
| 99 | + yang memasukkan *key* Symbol dan non-Symbol, *hash* akan lanjut dengan |
| 100 | + memisahkan dan sebuah peringatan dikeluarkan. Anda akan butuh pemanggilan |
| 101 | + kode untuk melewati hash yang terpisah untuk memastikan perilaku yang benar |
| 102 | + pada Ruby 3. |
| 103 | +
|
| 104 | + ```ruby |
| 105 | + def foo(h={}, key: 42); end; foo("key" => 43, key: 42) # warned |
| 106 | + def foo(h={}, key: 42); end; foo({"key" => 43, key: 42}) # warned |
| 107 | + def foo(h={}, key: 42); end; foo({"key" => 43}, key: 42) # OK |
| 108 | + ``` |
| 109 | +
|
| 110 | +* Jika sebuah *method* tidak menerima *keyword* dan dipanggil dengan *keyword*, |
| 111 | + *keyword* akan dianggap sebagai sebuah *positional hash* tanpa peringatan. |
| 112 | + Perilaku ini akan berlanjut pada Ruby 3. |
| 113 | +
|
| 114 | + ```ruby |
| 115 | + def foo(opt={}); end; foo( key: 42 ) # OK |
| 116 | + ``` |
| 117 | +
|
| 118 | +* Non-symbol diperbolehkan sebagai sebuah *keyword argument* jika *method* |
| 119 | + menerima *arbitrary keyword*. [[Feature #14183]](https://bugs.ruby-lang.org/issues/14183) |
| 120 | +
|
| 121 | + ```ruby |
| 122 | + def foo(**kw); p kw; end; foo("str" => 1) #=> {"str"=>1} |
| 123 | + ``` |
| 124 | +
|
| 125 | +* <code>**nil</code> diperbolehkan pada definisi *method* sebagai penanda |
| 126 | + langsung bahwa *method* menerima *keyword* kosong. Memanggil *method* |
| 127 | + seperti itu dengan *keyword* akan menyebabkan ArgumentError. [[Feature #14183]](https://bugs.ruby-lang.org/issues/14183) |
| 128 | +
|
| 129 | + ```ruby |
| 130 | + def foo(h, **nil); end; foo(key: 1) # ArgumentError |
| 131 | + def foo(h, **nil); end; foo(**{key: 1}) # ArgumentError |
| 132 | + def foo(h, **nil); end; foo("str" => 1) # ArgumentError |
| 133 | + def foo(h, **nil); end; foo({key: 1}) # OK |
| 134 | + def foo(h, **nil); end; foo({"str" => 1}) # OK |
| 135 | + ``` |
| 136 | +
|
| 137 | +* Melewatkan sebuah *keyword splat* kosong pada sebuah *method* yang tidak |
| 138 | + menerima *keyword* tidak akan lagi melewati sebuah *hash* kosong, kecuali |
| 139 | + *hash* kosong dibutuhkan sebagai sebuah *required parameter*, di mana kasus |
| 140 | + sebuah peringatan akan dikelurkan. Hilangkan *double splat* untuk melanjutkan |
| 141 | + sebuah *positional hash*. [[Feature #14183]](https://bugs.ruby-lang.org/issues/14183) |
| 142 | +
|
| 143 | + ```ruby |
| 144 | + h = {}; def foo(*a) a end; foo(**h) # [] |
| 145 | + h = {}; def foo(a) a end; foo(**h) # {} and warning |
| 146 | + h = {}; def foo(*a) a end; foo(h) # [{}] |
| 147 | + h = {}; def foo(a) a end; foo(h) # {} |
| 148 | + ``` |
| 149 | +
|
| 150 | +## Fitur Baru Penting Lainnya |
| 151 | +
|
| 152 | +* Sebuah *method reference operator*, <code>.:</code>, dikenalkan sebagai |
| 153 | + sebuah fitur eksperimental. |
| 154 | + [[Feature #12125]](https://bugs.ruby-lang.org/issues/12125), |
| 155 | + [[Feature #13581]]( https://bugs.ruby-lang.org/issues/13581) |
| 156 | +
|
| 157 | +* *Numbered parameter* sebagai *default block parameter* dikenalkan sebagai |
| 158 | + sebuah fitur eksperimental. |
| 159 | + [[Feature #4475]](https://bugs.ruby-lang.org/issues/4475) |
| 160 | +
|
| 161 | +* Sebuah *beginless range* secara eksperimental dikenalkan. Ini mungkin tidak |
| 162 | + berguna seperti *endless range*, tetapi sangat baik untuk penggunan DSL. |
| 163 | + [[Feature #14799]](https://bugs.ruby-lang.org/issues/14799) |
| 164 | +
|
| 165 | + ```ruby |
| 166 | + ary[..3] # identical to ary[0..3] |
| 167 | + rel.where(sales: ..100) |
| 168 | + ``` |
| 169 | +
|
| 170 | +* `Enumerable#tally` ditambahkan. Ini menghitung banyak elemen dari setiap |
| 171 | + elemen. |
| 172 | + |
| 173 | + ```ruby |
| 174 | + ["a", "b", "c", "b"].tally |
| 175 | + #=> {"a"=>1, "b"=>2, "c"=>1} |
| 176 | + ``` |
| 177 | + |
| 178 | +* Pemanggilan sebuah *private method* pada `self` sekarang diperbolehkan. |
| 179 | + [[Feature #11297]](https://bugs.ruby-lang.org/issues/11297) |
| 180 | + [[Feature #16123]](https://bugs.ruby-lang.org/issues/16123) |
| 181 | + |
| 182 | + ```ruby |
| 183 | + def foo |
| 184 | + end |
| 185 | + private :foo |
| 186 | + self.foo |
| 187 | + ``` |
| 188 | + |
| 189 | +* `Enumerator::Lazy#eager` ditambahkan. Ini menghasilkan sebuah *non-lazy |
| 190 | + enumerator* dari sebuah *lazy enumerator*. |
| 191 | + [[Feature #15901]](https://bugs.ruby-lang.org/issues/15901) |
| 192 | + |
| 193 | + ```ruby |
| 194 | + a = %w(foo bar baz) |
| 195 | + e = a.lazy.map {|x| x.upcase }.map {|x| x + "!" }.eager |
| 196 | + p e.class #=> Enumerator |
| 197 | + p e.map {|x| x + "?" } #=> ["FOO!?", "BAR!?", "BAZ!?"] |
| 198 | + ``` |
| 199 | + |
| 200 | +## Perbaikan performa |
| 201 | + |
| 202 | +* JIT [Eksperimental] |
| 203 | + |
| 204 | + * Kode JIT-*ed* di-*recompile* untuk kode *less-optimized* ketika sebuah |
| 205 | + asumsi optimisasi dibatalkan. |
| 206 | + |
| 207 | + * *Method inlining* dilakukan ketika sebuah *method* dianggap murni. |
| 208 | + Optimisasi ini masih eksperimental dan banyak *method* dianggap tidak |
| 209 | + murni. |
| 210 | + |
| 211 | + * Nilai default dari `--jit-min-calls` diubah dari 5 ke 10,000 |
| 212 | + |
| 213 | + * Nilai default dari `--jit-max-cache` diubah dari 1,000 ke 100 |
| 214 | + |
| 215 | +* `Symbol#to_s`, `Module#name`, `true.to_s`, `false.to_s`, dan `nil.to_s` |
| 216 | + sekarang selalu mengembalikan sebuah *frozen string*. *String* yang |
| 217 | + dikembalikan selalu sama untuk sebuah objek. [Eksperimental] |
| 218 | + [[Feature #16150]](https://bugs.ruby-lang.org/issues/16150) |
| 219 | + |
| 220 | +* Performa dari `CGI.escapeHTML` ditingkatkan. [GH-2226](https://github.com/ruby/ruby/pull/2226) |
| 221 | + |
| 222 | +## Perubahan penting lainnya sejak 2.6 |
| 223 | + |
| 224 | +* Beberapa pustaka standar diperbarui. |
| 225 | + * Bundler 2.1.0.pre.1 |
| 226 | + * RubyGems 3.1.0.pre.1 |
| 227 | + * CSV 3.1.2 ([NEWS](https://github.com/ruby/csv/blob/v3.1.2/NEWS.md)) |
| 228 | + * Racc 1.4.15 |
| 229 | + * REXML 3.2.3 ([NEWS](https://github.com/ruby/rexml/blob/v3.2.3/NEWS.md)) |
| 230 | + * RSS 0.2.8 ([NEWS](https://github.com/ruby/rss/blob/v0.2.8/NEWS.md)) |
| 231 | + * StringScanner 1.0.3 |
| 232 | + * Beberapa pustaka lainnya yang tidak memiliki versi asli juga diperbarui. |
| 233 | + |
| 234 | +* `Proc.new` dan `proc` tanpa *block* dalam sebuah *method* dipanggil dengan |
| 235 | + sebuah *block* akan diperingatkan sekarang. |
| 236 | + |
| 237 | +* `lambda` tanpa *block* dalam sebuah *method* dipanggil dengan sebuah |
| 238 | + *block errs*. |
| 239 | + |
| 240 | +* Memperbarui versi Unicode dan Emoji dari 11.0.0 ke 12.0.0. [[Feature #15321]](https://bugs.ruby-lang.org/issues/15321) |
| 241 | + |
| 242 | +* Memperbarui versi Unicode ke 12.1.0, menambahkan dukungan U+32FF SQUARE |
| 243 | + ERA NAME REIWA. [[Feature #15195]](https://bugs.ruby-lang.org/issues/15195) |
| 244 | + |
| 245 | +* `Date.jisx0301`, `Date#jisx0301`, dan `Date.parse` mendukung *Japanese era* |
| 246 | + yang baru. [[Feature #15742]](https://bugs.ruby-lang.org/issues/15742) |
| 247 | + |
| 248 | +* Membutuhkan *compiler* untuk mendukung C99 [[Misc #15347]](https://bugs.ruby-lang.org/issues/15347) |
| 249 | + * Detail dialek kami: <https://bugs.ruby-lang.org/projects/ruby-master/wiki/C99> |
| 250 | + |
| 251 | +Lihat [NEWS](https://github.com/ruby/ruby/blob/v2_7_0_preview2/NEWS) atau |
| 252 | +[commit logs](https://github.com/ruby/ruby/compare/v2_6_0...v2_7_0_preview2) |
| 253 | +untuk lebih detail. |
| 254 | + |
| 255 | +Dengan perubahan tersebut, [3670 berkas berubah, 201242 sisipan(+), |
| 256 | +88066 terhapus(-)](https://github.com/ruby/ruby/compare/v2_6_0...v2_7_0_preview2) |
| 257 | +sejak Ruby 2.6.0! |
| 258 | + |
| 259 | +Nikmati memprogram dengan Ruby 2.7! |
| 260 | + |
| 261 | +## Unduh |
| 262 | + |
| 263 | +* <https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0-preview2.tar.bz2> |
| 264 | + |
| 265 | + SIZE: 14555229 bytes |
| 266 | + SHA1: 7d9eed71115acfc8851747517904c1c6809872a9 |
| 267 | + SHA256: 417c84346ba84d664a13833c94c6d9f888c89bb9bee9adf469580441eaede30b |
| 268 | + SHA512: 7066ececebbbba4b2933ba1a4f70cdef373169910802259a3e52b4fc144ba298f3cffda4be5fe8a7be8ef769ed43076fa046a9ac2c13bb733475b9852112c6f0 |
| 269 | + |
| 270 | +* <https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0-preview2.tar.gz> |
| 271 | + |
| 272 | + SIZE: 16622499 bytes |
| 273 | + SHA1: 5e998eb37ef54e650c0206184d56f506359d5477 |
| 274 | + SHA256: bda4b8dc340fad425c8099400fe3ef8e7393837d7e6e1bfae41843d1d938ebc4 |
| 275 | + SHA512: dbf05d6ddab59062f507342b25b8c21670b02bdd49e77bda947870607f4bf9049e5e7ddfde6bbce2e1749ca92568da9be3e5f30601b1eb450f10d8add952239a |
| 276 | + |
| 277 | +* <https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0-preview2.tar.xz> |
| 278 | + |
| 279 | + SIZE: 11874200 bytes |
| 280 | + SHA1: 4356e1726027795a5c6b08572bb37bcb5a8c55d6 |
| 281 | + SHA256: fa39f088331f6d505154aa9d025aab177fdffedfbbabccd900b8c02e745bc077 |
| 282 | + SHA512: a057a186d85fcdf123abd69d584ef3adb20ad4397521e14306395d34102c3d818fe2d34a6476db01effcde479da9a77076cbb6d30bca40f1471ce3f5d3a995a9 |
| 283 | + |
| 284 | +* <https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0-preview2.zip> |
| 285 | + |
| 286 | + SIZE: 20576618 bytes |
| 287 | + SHA1: 891b70ec76e9e776774a49b3ce24832a944422b3 |
| 288 | + SHA256: 81a240bead4438b064cb4cde562b483b82ec8e414bac057a6df43df5a247545c |
| 289 | + SHA512: 1a8d4503374d31abf43182e2af6902ea6e5295f55d539415c8268b1d6a0fa83a975648c225ae986e687d5283dc2d180cf1e608841485506e4b0ac5efc154949a |
| 290 | + |
| 291 | +## Apa itu Ruby |
| 292 | + |
| 293 | +Ruby pertama kali dikembangkan oleh Matz (Yukihiro Matsumoto) pada 1993 |
| 294 | +dan sekarang dikembangkan sebagai *open source*. Ruby berjalan di berbagai |
| 295 | +jenis *platform* dan digunakan di seluruh dunia khususnya pengembangan *web*. |
0 commit comments