Fitur baru di Ruby 2.3 dan 2.4
Ada baiknya untuk tetap mengikuti fitur bahasa baru yang akan membantu permainan golf Anda. Ada beberapa yang hebat di Rubi terbaru.
Ruby 2.3
Operator navigasi yang aman: &.
Saat Anda memanggil metode yang mungkin kembali nil
tetapi Anda ingin membuat panggilan metode tambahan jika tidak, Anda membuang byte yang menangani nil
kasus ini:
arr = ["zero", "one", "two"]
x = arr[5].size
# => NoMethodError: undefined method `size' for nil:NilClass
x = arr[5].size rescue 0
# => 0
"Operator navigasi aman" menghentikan rantai panggilan metode jika seseorang kembali nil
dan kembali nil
untuk seluruh ekspresi:
x = arr[5]&.size || 0
# => 0
Array#dig
& Hash#dig
Akses mendalam ke elemen bersarang, dengan nama pendek yang bagus:
o = { foo: [{ bar: ["baz", "qux"] }] }
o.dig(:foo, 0, :bar, 1) # => "qux"
Kembali nil
jika menyentuh jalan buntu:
o.dig(:foo, 99, :bar, 1) # => nil
Enumerable#grep_v
Kebalikan dari - Enumerable#grep
mengembalikan semua elemen yang tidak cocok dengan argumen yang diberikan (dibandingkan dengan ===
). Seperti grep
, jika sebuah blok diberikan hasilnya dikembalikan sebagai gantinya.
(1..10).grep_v 2..5 # => [1, 6, 7, 8, 9, 10]
(1..10).grep_v(2..5){|v|v*2} # => [2, 12, 14, 16, 18, 20]
Hash#to_proc
Mengembalikan Proc yang menghasilkan nilai untuk kunci yang diberikan, yang bisa sangat berguna:
h = { N: 0, E: 1, S: 2, W: 3 }
%i[N N E S E S W].map(&h)
# => [0, 0, 1, 2, 1, 2, 3]
Ruby 2.4
Ruby 2.4 belum keluar, tetapi akan segera dan memiliki beberapa fitur kecil yang hebat. (Ketika dirilis saya akan memperbarui posting ini dengan beberapa tautan ke dokumen.) Saya belajar tentang sebagian besar dari ini di posting blog besar ini .
Enumerable#sum
Tidak ada lagi arr.reduce(:+)
. Sekarang Anda bisa melakukannya arr.sum
. Dibutuhkan argumen nilai awal opsional, yang default ke 0 untuk elemen Numeric ( [].sum == 0
). Untuk jenis lain Anda harus memberikan nilai awal. Itu juga menerima blok yang akan diterapkan ke setiap elemen sebelum penambahan:
[[1, 10], [2, 20], [3, 30]].sum {|a,b| a + b }
# => 66
Integer#digits
Ini mengembalikan array angka angka dalam urutan signifikansi terkecil ke terbesar:
123.digits # => [3, 2, 1]
Dibandingkan dengan, katakanlah 123.to_s.chars.map(&:to_i).reverse
, ini cukup bagus.
Sebagai bonus, dibutuhkan argumen radix opsional:
a = 0x7b.digits(16) # => [11, 7]
a.map{|d|"%x"%d} # => ["b", "7"]
Comparable#clamp
Lakukan apa yang tertulis di kaleng:
v = 15
v.clamp(10, 20) # => 15
v.clamp(0, 10) # => 10
v.clamp(20, 30) # => 20
Karena itu dalam Sebanding Anda dapat menggunakannya dengan kelas apa pun yang termasuk Sebanding, misalnya:
?~.clamp(?A, ?Z) # => "Z"
String#unpack1
Penghematan 2 byte .unpack(...)[0]
:
"👻💩".unpack(?U) # => [128123]
"👻💩".unpack(?U)[0] # => 128123
"👻💩".unpack1(?U) # => 128123
Presisi argumen untuk Numeric#ceil
, floor
, dantruncate
Math::E.ceil(1) # => 2.8
Math::E.floor(1) # => 2.7
(-Math::E).truncate(1) # => -2.7
Penugasan berganda dalam kondisi
Ini menimbulkan kesalahan dalam versi Ruby yang lebih lama, tetapi diizinkan di 2.4.
(a,b=1,2) ? "yes" : "no" # => "yes"
(a,b=nil) ? "yes" : "no" # => "no"