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