การแมพค่าจากสองอาเรย์ใน Ruby
หากคุณกำลังเปลี่ยนจาก Python มาที่ Ruby และกำลังมองหาวิธีในการทำงานที่ใกล้เคียงกับฟังก์ชันที่คุณคุ้นเคย อาจพบกับความท้าทายทั่วไป: การแมพค่าจากสองอาเรย์ และจากนั้นลดผลลัพธ์ บล็อกโพสต์นี้จะนำคุณผ่านแนวทางในการแก้ปัญหานี้ใน Ruby โดยแบ่งออกเป็นขั้นตอนอย่างชัดเจน
เข้าใจปัญหา
ใน Python คุณอาจจะใช้ฟังก์ชัน map()
เพื่อรวมสองลิสต์เข้าด้วยกันทีละองค์ประกอบ โดยมักจะตามด้วย reduce()
เพื่อรวมผลลัพธ์เหล่านั้น ในฐานะที่เป็นนักพัฒนาของ Ruby คุณอาจพบว่าวิธีการที่เทียบเท่านั้นแตกต่างออกไปเล็กน้อย ทำให้เกิดความสับสนเมื่อพยายามทำงานที่เหมือนกัน
ตัวอย่างเช่น ใน Python คุณสามารถแสดงการดำเนินการของคุณได้ดังนี้:
sum = reduce(lambda x, y: x + y, map(lambda x, y: x * y, weights, data))
โค้ดนี้จะคูณองค์ประกอบที่ตรงกันจาก weights
และ data
และเก็บผลรวมของพวกเขา มาดูกันว่าจะแก้ปัญหานี้ใน Ruby ได้อย่างไร
โซลูชันของ Ruby
ใน Ruby เมธอด zip
ช่วยให้คุณรวมอาเรย์สองอันเข้าด้วยกันเป็นอาเรย์ของคู่ที่คุณสามารถประมวลผลด้วย map
และ reduce
ได้ นี่คือวิธีที่คุณสามารถทำการดำเนินการเดียวกันใน Ruby โดยใช้วิธีการที่กระชับ
การแบ่งขั้นตอนอย่างละเอียด
-
รวมอาเรย์ด้วย
zip
: เมธอดzip
ช่วยให้คุณจับคู่ขึ้นองค์ประกอบจากทั้งสองอาเรย์ -
ใช้
map
: เมื่อรวมกันแล้ว คุณสามารถใช้เมธอดmap
เพื่อทำการดำเนินการกับคู่ขององค์ประกอบแต่ละคู่ -
ลดด้วย
reduce
: สุดท้าย ใช้reduce
เพื่อรวมผลลัพธ์
นี่คือโค้ด Ruby สุดท้ายของคุณ:
weights.zip(data).map(&:*).reduce(:+)
คำอธิบายของแต่ละขั้นตอน
-
weights.zip(data)
: จับคู่weights
และdata
อาเรย์เข้าด้วยกันเป็นคู่ หากweights = [2, 3]
และdata = [4, 5]
ผลลัพธ์จะเป็น[[2, 4], [3, 5]]
-
map(&:*)
: ไวยากรณ์&:*
เป็นรูปแบบย่อใน Ruby ซึ่งบล็อก&:*
ถูกใช้กับแต่ละคู่จากอาเรย์ที่ถูก zip มันจะคูณแต่ละคู่ทำให้ได้[8, 15]
สำหรับตัวอย่างก่อนหน้านี้ -
reduce(:+)
: สุดท้าย เมธอดนี้จะรวมผลิตภัณฑ์ทั้งหมด ทำให้คุณได้ผลรวม ในกรณีของเราคือ8 + 15
จะได้23
การใช้ ActiveSupport (Ruby 1.8)
หากคุณใช้ Ruby on Rails หรือต้องการใช้งาน ActiveSupport ใน Ruby 1.8 คุณสามารถทำงานเดียวกันนี้ได้โดยใช้ฟีเจอร์อื่น:
weights.zip(data).map(&:*).reduce(&:+)
การใช้งานนี้ช่วยเพิ่มความอ่านง่าย และคุ้นเคยกับผู้ที่มาจากภูมิหลังการเขียนโปรแกรมเชิงฟังก์ชัน
สรุป
การแมพค่าจากสองอาเรย์และลดผลลัพธ์ใน Ruby นั้นไม่เพียงแต่ทำได้ง่าย แต่ยังมีประสิทธิภาพสูงอีกด้วย ด้วยการรวมกันของ zip
, map
, และ reduce
คุณมีเครื่องมือที่ทรงพลังในการจัดการกับการแปรรูปข้อมูลที่ซับซ้อนได้อย่างคล่องแคล่ว
นักพัฒนาหลายคนอาจจะคุ้นเคยกับไวยากรณ์ของ Python และในขณะที่ Ruby มีวิธีการที่แตกต่าง แต่ว่าหลักการที่ใช้มีความสอดคล้องกันอย่างใกล้ชิด หากคุณฝึกฝนต่อไป คุณจะพบว่าเมธอดของ Ruby นั้นมีความแสดงออกและมีพลังสำหรับความต้องการในการเขียนโปรแกรมของคุณ
ขอให้สนุกกับการเขียนโค้ด!