ทับทิมไม่เคยหยุดพัฒนา!
เวอร์ชัน 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 วิธีการใหม่ และคุณลักษณะทดลองบางอย่าง เช่น การจับคู่รูปแบบ
โปรดแชร์บทความนี้เพื่อกระจายข่าว!
ขอบคุณที่อ่านนะคะ 🙂