คุณรู้หรือไม่ว่าการใช้วิธี Ruby ที่ถูกต้องสามารถช่วยคุณได้มาก
ยิ่งคุณคุ้นเคยกับวิธีการต่างๆ มากเท่าใด ยิ่งสร้างรหัสการทำงานได้เร็วเท่านั้น และโค้ดนี้จะยิ่งดีขึ้นทั้งในด้านประสิทธิภาพและคุณภาพ
วันนี้เลยอยากมาแนะนำ 7 วิธีที่น่าสนใจที่คุณอาจไม่เคยเห็นมาก่อน
สารบัญ
- เมธอด 1 Integer#digits (ทับทิม 2.4)
- 2 วิธีการแตะ
- 3 Array#values_at
- 4 แฮช#transform_values (ทับทิม 2.4)
- 5 Kernel#itself (ทับทิม 2.2)
- 6 อาร์เรย์#จำนวน
- 7 นับได้#รอบ
- 8 สรุป
- 8.1 ที่เกี่ยวข้อง
วิธีจำนวนเต็ม#หลัก (ทับทิม 2.4)
นี่เป็นวิธีการใหม่ใน Ruby 2.4 และมีประโยชน์มากหากคุณต้องการทำงานกับตัวเลขแต่ละตัวของจำนวนเต็ม
หมายเหตุ :ในกรณีที่คุณไม่สามารถทำการเปลี่ยนแปลง Ruby 2.4 ได้ทัน ขณะนี้ Fixnum &Bignum เลิกใช้แล้ว และทั้งสองอย่างรวมกันเป็นจำนวนเต็ม
คุณอาจคิดว่าการใช้การจัดทำดัชนีแบบอาร์เรย์อาจใช้งานได้ :
2[0] # 0 2[1] # 1
แต่สิ่งที่คุณได้รับไม่ใช่ตัวเลข แต่เป็นไบนารีบิตที่ประกอบเป็นตัวเลขนี้
ดังนั้นก่อน-digits
วิธีการแก้ปัญหาทั่วไปคือการแปลงตัวเลขเป็นสตริง จากนั้นแบ่งสตริงนั้นเป็นอาร์เรย์ของอักขระโดยใช้ chars
เมธอด และสุดท้ายแปลงทุกสตริงกลับเป็นจำนวนเต็ม
ตัวอย่าง :
123.to_s.chars.map(&:to_i).reverse [3, 2, 1]
แต่ในโพสต์-digits
method world คุณสามารถทำได้ง่ายๆ:
123.digits [3, 2, 1]
ดีขึ้นมากใช่มั้ย
วิดีโอ :
วิธีการแตะ
บางครั้งคุณต้องการสร้างวัตถุ เรียกใช้วิธีการบางอย่างบนวัตถุนั้นแล้วส่งคืนวัตถุนั้น
คุณจะต้องทำสิ่งนี้ :
user = User.new user.name = "John" user
ปัญหาคือเราต้องจัดการกับตัวแปรชั่วคราวนี้
นี่คือที่ที่ tap
วิธีการมาช่วย!
ด้วย tap
ตัวอย่างสุดท้ายกลายเป็นสิ่งนี้:
User.new.tap { |user| user.name = "John" }
สังเกตว่าตัวแปรชั่วคราวหมดไปซึ่งเป็นสิ่งที่ดี 🙂
อาร์เรย์#values_at
หากคุณต้องการรับค่าที่ไม่ต่อเนื่องกันหลายค่าจากอาร์เรย์หรือแฮช คุณสามารถทำได้:
arr = [1,2,3,4,5] a, b, c = arr[0], arr[1], arr[4]
หรือคุณสามารถใช้ values_at
วิธีการ:
arr = [1,2,3,4,5] a, b, c = arr.values_at(0, 1, 4)
วิธีนี้ใช้ได้กับแฮชด้วย :
hash = {bacon: 300, chocolate: 200} p hash.values_at(:bacon, :chocolate) # [300, 200]
แฮช#transform_values (ทับทิม 2.4)
สมมติว่าคุณมีแฮชและต้องการเปลี่ยนค่าทั้งหมดด้วยเหตุผลบางประการ
ประเภทของสิ่งที่คุณจะทำกับ Array#map
.
ปัญหาเกี่ยวกับ map
คือคุณจะได้อาร์เรย์ของอาร์เรย์ (อาร์เรย์หลายมิติ) แทนที่จะเป็นแฮช นอกจากนี้ยังไม่มี Hash#map!
.
ทางออกหนึ่งอาจเป็นสิ่งนี้ :
h = {bacon: 200, coconut: 300} h.each { |k,v| h[k] = v*2 }
ในตัวอย่างนี้ เราคูณแต่ละค่าด้วยสอง
ซึ่งส่งผลใน :
{:bacon=>400, :coconut=>600}
ตั้งแต่ Ruby 2.4 มีวิธีที่ดีกว่านี้ :
h.transform_values! { |v| v * 2 }
นี่เป็นอีกวิธีหนึ่งที่มาจาก Rails ซึ่งขณะนี้มีให้ใช้งานนอกเฟรมเวิร์กแล้ว 🙂
เคอร์เนล#มันเอง (Ruby 2.2)
หากคุณบอกฉันว่าวิธีนี้ดูไม่ค่อยน่าสนใจในตอนแรก ฉันจะเห็นด้วยกับคุณ
แต่เหตุผลก็คือคุณต้องดูตัวอย่างที่ดีบ้าง
สมมติว่าเรามีอาร์เรย์ที่มีคำซ้ำกัน และเราต้องการนับมัน...
แม้ว่าจะมีหลายวิธีในการทำเช่นนี้ ฉันคิดว่านี่เป็นกรณีที่ดีสำหรับการทดสอบเพื่อนใหม่ของเรา:Kernel#itself
.
ตัวอย่าง :
words = %w(cat cat tiger dog cat) words.group_by(&:itself).transform_values(&:size)
สังเกตว่าฉันรวมสิ่งนี้กับ Hash#transform_values
. ได้อย่างไร !
ถ้า transform_values
ไม่พร้อมใช้งาน คุณสามารถทำได้:
words .group_by(&:itself) .each_with_object({}) { |(k,v), hash| hash[k] = v.size }
วิดีโอ :
หมายเหตุ :itself
เมธอดปรากฏขึ้นภายใต้ Object
ในเอกสารประกอบ แต่มีการกำหนดวิธีการใน Kernel
โมดูล
อาร์เรย์#จำนวน
บางครั้งคุณก็แค่ต้องนับอะไรบางอย่าง
แทนที่จะใช้ตัวนับ + วนซ้ำ คุณสามารถใช้ count
วิธีการ!
ตัวอย่าง :
letters = %w(a a a b c d a) letters.count("a") # 4
เวอร์ชันอาร์เรย์ของเมธอดนี้ยังใช้การบล็อก คุณจึงทำการนับที่ซับซ้อนยิ่งขึ้นได้
numbers = [1,2,3,4,5,6] numbers.count(&:even?) # 3
วิดีโอ :
นับได้#รอบ
คุณต้องการทำซ้ำรูปแบบบางอย่างหรือไม่? หรือคุณอาจต้องการสวิตช์เปิด/ปิดอย่างง่าย
จากนั้น Enumerable#cycle
อาจเป็นสิ่งที่คุณกำลังมองหา!
ตัวอย่าง :
array = %w(a b c) # Same as array * 3 array.cycle(3).to_a
แต่ฉันชอบใช้ cycle
คือการสร้างวัตถุ "สวิตช์" หรือ "สลับ"
switch = %w(on off).cycle switch.next
ข้อดีของสิ่งนี้คือคุณไม่จำเป็นต้องตรวจสอบค่าปัจจุบันของสวิตช์เพื่ออัปเดตด้วยตนเอง
โทรมาได้เลย next
&Ruby จะรู้แน่ว่าต้องทำยังไง 🙂
สรุป
คุณได้เรียนรู้เกี่ยวกับวิธีการใหม่ที่มีประโยชน์:Integer#digits, Kernel#tap, Array#values_at, Hash#transform_values, Kernel#itself, Array#count, Enumerable#cycle
ถ้าคุณรู้เรื่องพวกนี้ดีอยู่แล้ว! ถ้าไม่ ฉันหวังว่าคุณจะพบว่ามีประโยชน์ 🙂
ชอบบทความนี้หรือไม่? จากนั้น แบ่งปันกับเพื่อนของคุณ เพื่อให้พวกเขาได้สนุกไปกับมันด้วย!