Ruby เวอร์ชันใหม่มาพร้อมกับฟีเจอร์ใหม่และการปรับปรุงประสิทธิภาพ
คุณต้องการติดตามการเปลี่ยนแปลงหรือไม่
มาดูกัน!
ช่วงที่ไม่มีที่สิ้นสุด
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 ชนิดใหม่ใน Ruby 2.6
ฉันกำลังพูดถึง Enumerable::ArithmethicSequence
.
ขณะนี้มีสองวิธีที่ให้คุณ ArithmethicSequence
:
- ช่วง#ขั้นตอน
- ตัวเลข#ขั้นตอน
มีอะไรพิเศษเกี่ยวกับเรื่องนี้บ้าง
ลำดับเลขคณิต
รู้ว่ามีองค์ประกอบกี่องค์ประกอบ อะไรคือองค์ประกอบแรกและองค์ประกอบสุดท้าย
ตัวอย่าง :
(1..10).step(2).first # 1 (1..10).step(2).last # 9
ก่อน
เหล่านี้ &สุดท้าย
ไม่มีเมธอดก่อน Ruby 2.6 และนั่นคือสาเหตุที่ ArithmethicSequence
มีอยู่แล้ว!
ความแตกต่างอีกอย่างหนึ่ง :
(1..10).step(2) == (1..10).step(2) # false - Ruby 2.5 (and older) (1..10).step(2) == (1..10).step(2) # true - Ruby 2.6
ลำดับเลขคณิตสามารถเปรียบเทียบกันได้ใน 2.6
ผสาน Hash เข้ากับหลายอาร์กิวเมนต์
หากคุณต้องการรวมแฮชหลายอันเข้าด้วยกันเพื่อให้คุณสามารถรวมเป็นหนึ่งเดียว...
คุณทำได้ :
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}
ผลลัพธ์เหมือนเดิม แต่คุณต้องเรียกใช้เมธอดเพียงครั้งเดียว!
ตัวเลือกข้อยกเว้นใหม่
เมื่อคุณใช้วิธีการแปลงเช่น Integer
คุณจะได้รับข้อยกเว้นหากไม่สามารถแปลงค่าได้
ตัวอย่าง :
Integer("a") # ArgumentError (invalid value for Integer(): "a")
Ruby 2.6 เพิ่ม ข้อยกเว้น
. ใหม่ อาร์กิวเมนต์คำหลักเพื่อ:
- จำนวนเต็ม()
- โฟลต()
- เหตุผล()
- คอมเพล็กซ์()
คุณสามารถควบคุมพฤติกรรมของวิธีการเหล่านี้ได้ด้วยคำหลักนี้
ตัวอย่าง :
Integer("a", exception: false) # nil
Random.bytes
หากคุณต้องการไบต์สุ่ม Ruby 2.6 ให้เพิ่ม bytes
. ใหม่ วิธีการ สุ่ม
ชั้นเรียน
นี่คือตัวอย่าง :
Random.bytes(10) # "\xCD\r\xE6Wz\xBA)\x02\xC4\xDB"
นี่ไม่ใช่ฟังก์ชันใหม่ทั้งหมด เนื่องจากมีให้บริการผ่าน securerandom
. เสมอ โมดูล
require 'securerandom' SecureRandom.bytes(10)
ทำไมต้องกังวลกับวิธีการใหม่นี้?
Random.bytes
แลกเปลี่ยนความปลอดภัยเพื่อความเร็ว ซึ่งเร็วกว่า SecureRandom
8 เท่า .
ช่วง#%
%
ใหม่ %
เพิ่มเมธอดใน Range
. แล้ว ใน Ruby 2.6
ตัวอย่าง :
((0..) % 2).take(5) # [0, 2, 4, 6, 8]
วิธีนี้เทียบเท่ากับ Range#step
.
TracePoint#parameters
TracePoint
class ช่วยให้คุณติดตามเหตุการณ์ต่างๆ เช่น การเรียกใช้เมธอด การกำหนดคลาส &เธรด
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]]]
กองชั่วคราว
ฮีปชั่วคราวคือการปรับปรุงประสิทธิภาพสำหรับออบเจ็กต์อายุสั้นที่มีจุดมุ่งหมายเพื่อลดปัญหาการแตกแฟรกเมนต์หน่วยความจำ &การเรียกใช้ malloc ที่ช้า
Malloc เป็นวิธีที่ล่าม Ruby (และโปรแกรม C ส่วนใหญ่) ขอหน่วยความจำ จากระบบปฏิบัติการ
ตามรายการ NEWS เรากำลังดูการเร่งความเร็ว 6-7%
ฉันใช้เกณฑ์มาตรฐาน:
ดูเหมือนว่าจะมีประสิทธิภาพมากที่สุดเมื่อสร้างแฮชจำนวนมาก องค์ประกอบที่มีขนาดเล็กกว่า 10 รายการ .
แฮชที่ใหญ่ขึ้นจะช้าลงใน Ruby 2.6 (ตัวอย่าง 3) ตามผลลัพธ์เหล่านี้
วัตถุอื่นๆ ที่สามารถ ได้ประโยชน์จาก Transient Heap :
- อาร์เรย์
- โครงสร้าง
- อ็อบเจ็กต์ปกติ (จากคลาสที่คุณสร้าง)
Array#union &Array#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) จะกล่าวถึงในบทความเฉพาะ
ทับทิม 2.6 คาดว่าจะวางจำหน่ายใน 25 ธันวาคม 2018 .
หากคุณต้องการติดตามการเปลี่ยนแปลง พัฒนาทักษะ Ruby ของคุณและเป็นนักพัฒนา Ruby ที่ยอดเยี่ยม อย่าลืมเข้าร่วมจดหมายข่าว Ruby ของฉันวันนี้
ขอบคุณสำหรับการอ่าน!