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

คุณสมบัติ วิธีการ และการปรับปรุงใหม่ใน Ruby 2.7

ทับทิมไม่เคยหยุดพัฒนา!

เวอร์ชัน 2.7 มาพร้อมคุณสมบัติใหม่ วิธีการ และการปรับปรุงประสิทธิภาพ วางจำหน่ายเมื่อวันที่ 25 ธันวาคม 2019

ตอนนี้ตาม Matz…

นี่เป็นรุ่น 2.x ล่าสุดที่วางจำหน่าย เพราะปีหน้าเราจะได้ Ruby 3.0!

แต่ก่อนจะไปถึง…

มาดูการเปลี่ยนแปลงและฟีเจอร์ใหม่ใน 2.7 กัน เพื่อให้คุณพร้อมสำหรับการอัปเดตเวอร์ชัน

สารบัญ

  • 1 นับได้#tally
  • พารามิเตอร์ 2 หมายเลขสำหรับบล็อก [ทดลอง]
  • 3 Array#ทางแยก
  • 4 นับได้#filter_map
  • 5 Enumerator#produce
  • 6 IRB ยกกระชับใบหน้า?
  • การจับคู่รูปแบบทับทิม 7 ชิ้น [ทดลอง]
  • 8 การเปลี่ยนแปลงอื่นๆ
  • 9 สรุป
    • 9.1 ที่เกี่ยวข้อง

นับได้#นับ

นี่เป็นวิธี Ruby ใหม่ที่นับองค์ประกอบทั้งหมดในอาร์เรย์ &ส่งคืนแฮชด้วยการนับ

คุณสามารถทำได้ด้วยตัวเอง แต่ tally วิธีช่วยให้คุณประหยัดได้

นี่คือตัวอย่าง :

%w(a a b b c).tally

ซึ่งส่งผลใน :

{"a"=>3, "b"=>2, "c"=>1}

ฉันชอบมัน!

พารามิเตอร์ลำดับเลขสำหรับบล็อก [ทดลอง]

คุณลักษณะใหม่ที่น่าสนใจซึ่งฉันต้องการมาระยะหนึ่งแล้วคือชื่อเริ่มต้นสำหรับพารามิเตอร์บล็อก

นี่คือบล็อกปกติ โดยมีพารามิเตอร์เดียว :

[1,2,3].each { |n| ใส่ n }

|n|นี้ เป็นพารามิเตอร์ที่คุณต้องกำหนดเพื่อใช้งาน

แต่ถ้าเรามีชื่อเริ่มต้นล่ะ

นั่นเป็นหนึ่งในสิ่งดีๆ ที่ Ruby 2.7 นำมาด้วย แม้ว่าจะเป็นฟีเจอร์ทดลอง มันสามารถช่วยให้เราไม่ต้องพิมพ์มาก

หน้าตาเป็นแบบนี้ :

[1,2,3].each { วาง _1 }

โดยที่ _1 อ้างถึงพารามิเตอร์แรก คุณสามารถใช้ _2 หากคุณมีอันที่ 2 และใช่ _3 สำหรับพารามิเตอร์ตัวที่ 3 เป็นต้น

เจ๋งมาก!

ตอนนี้มีเรื่องเล็กน้อยเล็กน้อย

ฟีเจอร์นี้ถูกเสนอครั้งแรกให้มีลักษณะเหมือน @1 แต่นั่นดูเหมือนตัวแปรอินสแตนซ์มากเกินไป ดังนั้นหลังจากการสนทนาบางอย่างก็ตกลงกันโดยใช้ _1 แทน

อาร์เรย์#ทางแยก

นี่เป็นวิธีการใหม่ แต่ไม่ใช่ฟังก์ชันใหม่

อันที่จริง…

นี่เป็นเหมือนนามแฝงมากกว่า!

Ruby 2.6 เปิดตัว Array union &difference เมธอด เพื่อให้ตรงกับ Array#| . ที่กระชับยิ่งขึ้น และ Array#- .

แต่ปฏิบัติการที่หายไปคือ intersection ซึ่งมีอีกเวอร์ชั่นสั้นๆ ที่จำยาก

Array#& method .

ตอนนี้ :

วิธีการเหล่านี้ทำงานอย่างไรและทำงานอย่างไร

ตัวอย่าง :

[1, 2, 3].intersection([2, 3, 4])# [2, 3][1, 2, 3] &[2, 3, 4]# [2, 3] 

ก็…

ชื่อแบบแจกครับ intersection ค้นหาจุดตัดระหว่างสองอาร์เรย์ กล่าวอีกนัยหนึ่งคือพบว่าองค์ประกอบใดบ้างที่เหมือนกัน

เวอร์ชันสั้น แบบยาว
& ทางแยก
| ยูเนี่ยน
ความแตกต่าง

ฉันมักจะลืมไปว่าวิธีการใดใน 3 วิธีนี้ใช้ได้ผล!

แต่ด้วยวิธีการใหม่เหล่านี้ จำง่ายกว่ามาก เพราะ ชื่อมีความหมายบางอย่าง .

นั่นเป็นบทเรียนที่ดีในการเขียนโค้ดที่ดีนะ

นับได้#filter_map

filter_mapนี้ เมธอดคือการพยายามรวม select &map ให้เป็นหนึ่งเดียว

ทำไม?

เนื่องจากเป็นการดำเนินการทั่วไปในการกรองรายการก่อน จากนั้นจึงแมปองค์ประกอบที่เหลือ

คุณสามารถทำได้สองวิธี :

(1.8.8).select(&:even?).map { |n| n ** 2 }# OR(1.8.8).map { |n| n ** 2 ถ้า n.even? }.compact

เคยใช้ทั้งคู่ แต่ชอบแนวแรกเพราะตั้งใจชัดเจนกว่า

ตอนนี้ :

ใน Ruby 2.7 filter_map . นี้ วิธีนี้ทำได้ในครั้งเดียว

ถูกใจสิ่งนี้ :

(1.8.8).filter_map { |n| n ** 2 ถ้า n.even? }# [4, 16, 36, 64]

ฉันไม่ได้เป็นแฟนตัวยงของการมี if งบในบล็อก แต่บางครั้งพวกเขาจำเป็นต้องทำงานให้เสร็จ

นอกจากนี้ ยังมีสิ่งที่คุณควรรู้

filter_map การดำเนินการไม่ทำงานเหมือน map + compact เพราะมันลบ false วัตถุ และ compact ไม่ได้

สิ่งดีๆ ที่ควรจำไว้!

ตัวแจงนับ#produce

นี่เป็นวิธีการใหม่อีกวิธีหนึ่งที่คุณอาจสนใจ แต่ อาจต้องใช้ความคิดสร้างสรรค์ เพื่อให้ได้ประโยชน์สูงสุด

มันคือ Enumerator#produce วิธีการ

มันทำอะไร?

ตามข้อเสนอคุณลักษณะ :

“วิธีนี้สร้างลำดับอนันต์โดยที่แต่ละองค์ประกอบถัดไปจะถูกคำนวณโดยใช้บล็อกกับองค์ประกอบก่อนหน้า”

ครับ

อีกวิธีหนึ่งในการสร้างซีเควนซ์ที่ไม่สิ้นสุด!

นี่คือตัวอย่าง :

Enumerator.produce(1, &:next).take(5)# [1, 2, 3, 4, 5]

ในตัวอย่างนี้ ไม่สำคัญว่าคุณจะ take(10) หรือ take(10_000) คุณจะได้รับค่ามากมายจากมัน

ว่า 1 เป็นค่าเริ่มต้น

และ &:next เป็นวิธีที่เรียกค่านั้นเพื่อ produce องค์ประกอบถัดไปในลำดับ

IRB ยกกระชับใบหน้า?

เมื่อเร็ว ๆ นี้ IRB ได้รับความรักและความสนใจและ Ruby 2.7 ยังคงเพิ่มสิ่งนั้นอยู่

เรากำลังจะได้รับ :

  • การแก้ไขหลายบรรทัด
  • การเน้นไวยากรณ์
  • การรวม RDoc ในตัว
  • เปิดใช้งานประวัติคำสั่งโดยค่าเริ่มต้น
  • เปิดใช้งานการเติมข้อความอัตโนมัติโดยค่าเริ่มต้น

อันที่จริง :

นี่เป็นการเปลี่ยนแปลงครั้งใหญ่ที่คุณได้รับคำเตือนเมื่อเริ่มต้น irb ด้วย Ruby 2.7

หากคุณต้องการใช้ irb เวอร์ชันเก่าต่อไป คุณยังสามารถใช้ irb --legacy สั่งการ. ปัญหาหลักของฉันกับ IRB ใหม่นี้คือการแก้ไขบรรทัด ใน IRB รุ่นเก่า (หรือใน Pry) ฉันสามารถกด ALT ค้างไว้และกดลูกศรซ้ายเพื่อเคลื่อนที่ได้เร็วขึ้น แต่วิธีนี้ใช้ไม่ได้ใน IRB ใหม่

ลองดูสิว่ามันทำงานอย่างไรสำหรับคุณ

การจับคู่รูปแบบทับทิม [ทดลอง]

ฟีเจอร์ที่ได้รับการร้องขอบ่อยใน 2.7 คือการจับคู่รูปแบบ

ถูกทำเครื่องหมายว่าอยู่ในช่วงทดลอง

แต่การจับคู่รูปแบบคืออะไรและมีประโยชน์ต่อคุณอย่างไร

ถ้าฉันเข้าใจถูกต้อง การจับคู่รูปแบบก็เหมือนกับนิพจน์ทั่วไป แต่สำหรับโครงสร้างข้อมูล (อาร์เรย์/แฮช)

นี่คือตัวอย่าง :

[1,2,3] ใน [a,b,c] # true[1,2,3] ใน [a] # false

หากมีการจับคู่ ชื่อตัวแปรเหล่านี้ (เช่น a ) กลายเป็นตัวแปรท้องถิ่นที่คุณสามารถเข้าถึงได้

ตัวอย่างที่มีแฮช :

{ a:1, b:2, c:[] } ใน { a:a, b:b, c:[] }# truep a# 1

สิ่งนี้ใช้ in คีย์เวิร์ด

ไม่ใช่เรื่องใหม่แต่ไม่ธรรมดาเพราะก่อน Ruby 2.7 in ถูกใช้เป็นส่วนหนึ่งของ for . เท่านั้น วนซ้ำ (ท้อใจอย่างมากใน Ruby) ดังนั้นเราจึงนำคำหลักนี้กลับมาใช้ใหม่เพื่อประโยชน์บางอย่าง

ดียิ่งขึ้น

ไม่ว่าคุณจะใช้ตัวแปรอะไร a,b,c ใช้งานได้ แต่ f,g,h ได้ผลด้วย

มันคือทั้งหมดที่เกี่ยวกับรูปแบบ!

การเปลี่ยนแปลงอื่นๆ

การเปลี่ยนแปลงเพิ่มเติมเล็กน้อยที่ควรค่าแก่การกล่าวถึง

  • GC บดอัดใหม่ปรับปรุงการกระจายตัวของหน่วยความจำ
  • วิธีอาร์กิวเมนต์ **nil ตอนนี้ประกาศว่าเมธอดไม่รับคีย์เวิร์ด
  • วิธีอาร์กิวเมนต์ ... เพิ่มกลไกการส่งต่ออาร์กิวเมนต์ (ต้องใช้วงเล็บ เช่น make_salad(...) )
  • การปรับปรุงไฟเบอร์ กลุ่มไฟเบอร์ออบเจ็กต์ใหม่ (ซึ่งมีการจัดสรรเส้นใยใหม่) ทำให้เส้นใยมีประสิทธิภาพมากขึ้น
  • ปรับปรุงเธรด วิธีที่ดีกว่าและเหมาะสมกว่าในการสร้างเธรดทำให้มัลติเธรดเร็วขึ้น

คุณคิดอย่างไรเกี่ยวกับสิ่งเหล่านี้

ไฟล์ NEWS สำหรับ 2.7 กล่าวถึงการปรับปรุงประสิทธิภาพ 10 เท่าสำหรับทั้งการสร้างไฟเบอร์และเธรด ฉันไม่ได้ทดสอบด้วยตัวเอง แต่ถ้าคุณแจ้งให้เราทราบเกี่ยวกับผลลัพธ์ของคุณ

สรุป

ตอนนี้คุณอัพเดทการเปลี่ยนแปลงล่าสุดในภาษาโปรแกรม Ruby แล้ว! คุณได้เรียนรู้เกี่ยวกับการเปลี่ยนแปลงของ IRB วิธีการใหม่ และคุณลักษณะทดลองบางอย่าง เช่น การจับคู่รูปแบบ

โปรดแชร์บทความนี้เพื่อกระจายข่าว!

ขอบคุณที่อ่านนะคะ 🙂