ฉันจะแก้ไขอาร์เรย์ในขณะที่ทำซ้ำใน Ruby ได้อย่างไร


88

ฉันเพิ่งเรียนรู้ Ruby ดังนั้นขออภัยหากนี่เป็นมือใหม่เกินไปสำหรับที่นี่ แต่ฉันไม่สามารถหาข้อมูลนี้จากหนังสือพลั่วได้ (อาจจะอ่านไม่ละเอียดพอ) อย่างไรก็ตามถ้าฉันมีอาร์เรย์ดังนี้:

arr = [1,2,3,4,5]

... และฉันอยากจะบอกว่าคูณแต่ละค่าในอาร์เรย์ด้วย 3 ฉันได้ทำสิ่งต่อไปนี้:

arr.each {|item| item *= 3}

... จะไม่ได้รับสิ่งที่ฉันต้องการ (และฉันเข้าใจว่าทำไมฉันไม่ได้แก้ไขอาร์เรย์เอง)

สิ่งที่ฉันไม่ได้รับคือวิธีแก้ไขอาร์เรย์เดิมจากในบล็อกโค้ดหลังจากตัววนซ้ำ ฉันมั่นใจว่านี่เป็นเรื่องง่ายมาก

คำตอบ:


140

ใช้mapเพื่อสร้างอาร์เรย์ใหม่จากอาร์เรย์เก่า:

arr2 = arr.map {|item| item * 3}

ใช้map!เพื่อแก้ไขอาร์เรย์ในสถานที่:

arr.map! {|item| item * 3}

ดูการทำงานออนไลน์: ideone


2
หากคุณจำเป็นต้องปรับเปลี่ยนแต่ละองค์ประกอบจริง ๆ การใช้แผนที่จะสวยงามกว่านี้แน่นอน imho
fresskoma

2
และหากคุณต้องการแก้ไขอาร์เรย์เองให้ใช้แผนที่! แทน
Yoann Le Touche

18

arr.map! {|item| item*3}หากต้องการแก้ไขโดยตรงอาร์เรย์ใช้ เพื่อสร้างอาร์เรย์ใหม่บนพื้นฐานของเดิม (ซึ่งมักจะเป็นที่นิยม), arr.map {|item| item*3}การใช้งาน ในความเป็นจริงฉันมักจะคิดว่าสองครั้งก่อนที่จะใช้eachเพราะมักมีฟังก์ชั่นขั้นสูงเช่นmap, selectหรือinjectที่ไม่สิ่งที่ฉันต้องการ


จะเกิดอะไรขึ้นถ้าคุณไม่ต้องการทำการแจงนับ จะเกิดอะไรขึ้นถ้าคุณต้องการทำสิ่งที่ต้องการarr.map!{ destructive_op}เปลี่ยนแปลงอย่างถาวรarr?
ดาวสว่าง

1
@TrevorAlexander: ฉันไม่แน่ใจว่าคุณหมายถึงอะไร การถามเป็นคำถามจริงพร้อมรายละเอียดและรายละเอียดอาจจะคุ้มค่า
Chuck

ฉันจะต้องคิดเกี่ยวกับมัน นอกเหนือจากการปรับเปลี่ยนองค์ประกอบที่แคบมากการดำเนินการทำลายล้างในโครงสร้างใดที่ไม่สามารถนับได้
bright-star

@TrevorAlexander: ฉันยังคงเข้าใจยาก หากคุณไม่สามารถดูเนื้อหาของโครงสร้างคุณจะไม่สามารถแปลงเนื้อหาได้ ดูเหมือนว่าคุณไม่สนใจที่จะปรับเปลี่ยนโครงสร้างและแค่ต้องการกำหนดตัวแปร - แต่ฉันอาจเข้าใจผิด
Chuck

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.