Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

สำรวจ 9 การปรับปรุงสำคัญใน Ruby 2.6

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 อิลิเมนต์

สำรวจ 9 การปรับปรุงสำคัญใน Ruby 2.6

แฮชขนาดใหญ่ช้ากว่าใน 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 ของผมวันนี้

ขอบคุณที่อ่าน!