Ruby เวอร์ชันใหม่กำลังจะมาถึงพร้อมฟีเจอร์ใหม่และการปรับปรุงประสิทธิภาพ
อยากติดตามการเปลี่ยนแปลงเหล่านี้ไหม?
มา 살펴보자!
ช่วงไร้ที่สิ้นสุด (Endless Ranges)
Ruby 2.5 และเวอร์ชันก่อนหน้ารองรับรูปแบบหนึ่งของช่วงไร้ที่สิ้นสุด (ด้วย Float::INFINITY) แต Ruby 2.6 นำสิ่งนี้ขึ้นระดับใหม่
ช่วงไร้ที่สิ้นสุดใหม่ มีลักษณะดังนี้:
(1..)
สิ่งนี้ต่างจากช่วงทั่วไปที่มีค่าสิ้นสุด เช่น (1..10)
ตัวอย่างการใช้งาน:
["a", "b", "c"].zip(1..) # [["a", 1], ["b", 2], ["c", 3]] [1,2,3,4,5][1..] # [2, 3, 4, 5] (1..).step(5).take(100) # [1, 6, 11, 16, 21, 26, 31, 36, 41, 46]
คุณสามารถคิดตัวอย่างอื่นได้อีกไหม?
Enumerable::ArithmeticSequence
ชนิดออบเจกต์ Enumerable ใหม่ถูกเพิ่มเข้ามาใน Ruby 2.6
คือ Enumerable::ArithmeticSequence
ตอนนี้มี สองเมธอดที่ให้ ArithmeticSequence:
- Range#step
- Numeric#step
อะไรเป็นพิเศษของมัน?
ArithmeticSequence รู้ว่ามีสมาชิกกี่ตัว ตัวแรกคืออะไร และตัวสุดท้ายคืออะไร
ตัวอย่าง:
(1..10).step(2).first # 1 (1..10).step(2).last # 9
เมธอด first และ last นี้ไม่มีใน Ruby 2.6 ก่อนหน้า และนั่นคือเหตุผลที่ ArithmeticSequence ถูกสร้างขึ้น!
ความแตกต่างอีกอย่าง:
(1..10).step(2) == (1..10).step(2) # false - Ruby 2.5 (และก่อนหน้า) (1..10).step(2) == (1..10).step(2) # true - Ruby 2.6
ลำดับเลขคณิตสามารถเปรียบเทียบกันได้ใน 2.6
รวมแฮชหลายอาร์กิวเมนต์
หากต้องการรวมหลายแฮชให้กลายเป็นหนึ่งเดียว…
เดิมทำได้แบบนี้:
a = { a: 1 }
b = { b: 2 }
c = { c: 3 }
a.merge(b).merge(c) # {:a=>1, :b=>2, :c=>3}
Ruby 2.6 เพิ่มวิธีใหม่:
a.merge(b, c) # {:a=>1, :b=>2, :c=>3}
ผลลัพธ์เหมือนกัน แต่เรียกเมธอดเพียงครั้งเดียว!
ตัวเลือก Exception ใหม่
เมื่อใช้เมธอดแปลงค่าเช่น Integer จะได้ exception หากแปลงไม่ได้
ตัวอย่าง:
Integer("a") # ArgumentError (invalid value for Integer(): "a")
Ruby 2.6 เพิ่มอาร์กิวเมนต์คีย์เวิร์ด exception ใหม่ให้:
- Integer()
- Float()
- Rational()
- Complex()
คุณสามารถควบคุมพฤติกรรมของเมธอดเหล่านี้ด้วยคีย์เวิร์ดนี้
ตัวอย่าง:
Integer("a", exception: false) # nil
Random.bytes
หากต้องการไบต์สุ่ม Ruby 2.6 เพิ่มเมธอด bytes ใหม่ให้คลาส Random
ตัวอย่าง:
Random.bytes(10) # "\xCD\r\xE6Wz\xBA)\x02\xC4\xDB"
ฟังก์ชันนี้ไม่ใช่ใหม่ทั้งหมด เพราะทำได้ผ่านโมดูล securerandom มาแล้ว
require 'securerandom' SecureRandom.bytes(10)
ทำไมถึงเพิ่มเมธอดใหม่นี้?
Random.bytes แลกความปลอดภัยกับความเร็ว เร็วกว่า SecureRandom 8 เท่า
Range#%
เมธอด % ใหม่ถูกเพิ่มให้ Range ใน Ruby 2.6
ตัวอย่าง:
((0..) % 2).take(5) # [0, 2, 4, 6, 8]
เมธอดนี้เทียบเท่ากับ Range#step
TracePoint#parameters
คลาส TracePoint ช่วยติดตามเหตุการณ์เช่นการเรียกเมธอด การนิยามคลาส และเธรด
Ruby 2.6 เพิ่มเมธอด parameters ใหม่
ด้วยเมธอดใหม่นี้ คุณสามารถพิมพ์รายการพารามิเตอร์ของเมธอดที่ถูกเรียกได้
ตัวอย่าง:
TracePoint.trace(:call, :b_call, :c_call) do |tp| p [tp.event, tp.parameters] end def orange(a,b,c*) end orange(1,2,3)
ผลลัพธ์:
[:call, [[:req, :a], [:req, :b], [:rest, :c]]]
Transient Heap
Transient heap เป็นการปรับปรุงประสิทธิภาพสำหรับออบเจกต์ที่มีอายุสั้น ซึ่งมุ่งลดปัญหาการแยกส่วนหน่วยความจำและการเรียก malloc ที่ช้า
Malloc คือวิธีที่ตัวแปล Ruby (และโปรแกรม C ส่วนใหญ่) ขอ หน่วยความจำ จากระบบปฏิบัติการ
ตามรายการ NEWS คาดหวังการเร่งความเร็ว 6-7%
ผมรัน benchmark:
ดูเหมือนว่ามีประสิทธิภาพมากที่สุดเมื่อสร้างแฮชมากมาย น้อยกว่า 10 อิลิเมนต์

แฮชขนาดใหญ่ช้ากว่าใน Ruby 2.6 (preview 3) ตามผลลัพธ์นี้
ออบเจกต์อื่นที่ ได้ประโยชน์จาก Transient Heap:
- Arrays
- Struct
- ออบเจกต์ทั่วไป (จากคลาสที่คุณสร้าง)
Array#union และ Array#difference
เมธอดใหม่สองเมธอด คือ union และ difference ถูกเพิ่มให้คลาส Array ใน Ruby 2.6
ตัวอย่าง:
[1,2,3,4,5].difference([3]) # [1, 2, 4, 5] [1,2,3,4,5].union([5,6,7]) # [1, 2, 3, 4, 5, 6, 7]
เมธอดใหม่เหล่านี้รับอาร์กิวเมนต์หลายตัวได้
สรุป
Ruby 2.6 มาพร้อมฟีเจอร์ใหม่ที่มีประโยชน์ช่วยให้คุณเขียนโค้ดดีขึ้นในเวลาน้อยลง ฟีเจอร์เกี่ยวกับประสิทธิภาพอีกอย่างคือ MJIT (Method Based Just-in-Time Compiler) จะครอบคลุมในบทความเฉพาะ
Ruby 2.6 คาดว่าจะปล่อยเมื่อ 25 ธันวาคม 2018
หากอยากติดตามการเปลี่ยนแปลง พัฒนาทักษะ Ruby และเป็นนักพัฒนาที่ยอดเยี่ยม อย่าลืมสมัครรับจดหมายข่าว Ruby ของผมวันนี้
ขอบคุณที่อ่าน!