Range ใน Ruby คืออะไรและทำงานอย่างไร
ช่วงคือออบเจ็กต์ที่มีค่าเริ่มต้นและค่าสิ้นสุด ซึ่งช่วยให้คุณสร้างลำดับที่ครอบคลุมช่วงทั้งหมดระหว่างสองค่านี้
คุณสามารถไปจาก 1
ถึง 20
หรือจาก "a"
ถึง "z"
.
ในบทความนี้ คุณจะค้นพบ :
- วิธีสร้างช่วงทับทิม
- วิธีใช้
step
&include?
วิธีการในทับทิม - ระยะทำงานอย่างไรภายใต้ประทุน
มาทำสิ่งนี้กันเถอะ!
ช่วงการทำความเข้าใจ
เพื่อเป็นการเตือนความจำ นี่คือลักษณะไวยากรณ์ของช่วง Ruby:
(1..20)
วงเล็บไม่จำเป็นต้องกำหนด Range
.
แต่ถ้าคุณต้องการเรียกใช้เมธอดในช่วงของคุณ คุณจะต้องใช้เมธอดเหล่านี้ มิฉะนั้น คุณกำลังเรียกใช้เมธอดในองค์ประกอบที่ 2 ของช่วง แทนที่จะเป็นช่วงเอง
Range
คลาสมี Enumerable ดังนั้นคุณจึงได้รับวิธีการวนซ้ำที่มีประสิทธิภาพโดยไม่ต้องแปลงช่วงเป็นอาร์เรย์
วิธี Ruby Step
Range
มีวิธีการที่เป็นประโยชน์ เช่น step
วิธีการ
ตัวอย่าง :
(10..20).step(2).to_a# [10, 12, 14, 16, 18, 20]
เมื่อใช้วิธีนี้ คุณจะวนซ้ำช่วงโดยเพิ่มทีละ n
โดยที่ n
เป็นอาร์กิวเมนต์ที่ส่งผ่านไปยัง step
.
จะทราบได้อย่างไรว่าตัวเลขอยู่ภายในช่วง
Range
อื่นๆ วิธีที่ต้องระวังคือ cover?
&include?
.
มันคงเป็นความผิดพลาดที่จะคิดว่าพวกเขาทำสิ่งเดียวกันเพราะพวกเขาไม่ทำ
include?
method ทำได้ตามที่คุณคาดไว้ ตรวจสอบการรวมภายในช่วง จึงจะเทียบเท่ากับการขยาย Range
ลงใน Array
และตรวจสอบว่ามีอะไรอยู่ในนั้นหรือไม่
แต่ cover?
แตกต่างกัน ทั้งหมดที่ทำคือ ตรวจสอบกับค่าเริ่มต้น &สิ้นสุดของช่วง (begin <= obj <= end
) ซึ่งสามารถให้ผลลัพธ์ที่ไม่คาดคิดได้
ตัวอย่าง :
('a'..'z').include? "cc" # false('a'..'z').cover? "cc" #จริง
cover?
ตัวอย่างเทียบเท่ากับ:
"a" <="cc" &&"cc" <="z"
เหตุผลที่ส่งคืน true
คือ เปรียบเทียบสตริงทีละอักขระ . เนื่องจาก "a" มาก่อน "c" อักขระที่อยู่หลัง "c" ตัวแรกจึงไม่สำคัญ
มีการใช้ช่วงใน Ruby อย่างไร
ขอบเขตไม่จำกัดเฉพาะตัวเลขและตัวอักษร คุณสามารถใช้วัตถุใดๆ ก็ได้ตราบใดที่ใช้วิธีการต่อไปนี้:<=>
และ succ
.
ตัวอย่างเช่น นี่คือช่วง DateTime:
require 'time't1 =DateTime.newt2 =DateTime.new + 30next_30_days =t1..t2# ตัวอย่าง usenext_30_days.select(&:friday?).map(&:day)
แล้วมันทำงานอย่างไร? มาดูการใช้งานนี้กัน:
def range(a, b) # ถ้าองค์ประกอบแรกใหญ่กว่าวินาที # แล้วนี่ไม่ใช่ช่วงที่ต่อเนื่องกัน return [] ถ้า a> b out =[] # ล่วงหน้าจนกว่าองค์ประกอบที่ 2 จะเหมือนกัน # เป็นอันแรกในขณะที่ a !=b ออก <เราได้เพิ่มความคิดเห็นเพื่อช่วยให้คุณเข้าใจสิ่งที่เกิดขึ้น
แนวคิดคือเราเรียกเมธอดถัดไปในออบเจ็กต์แรกไปเรื่อยๆ จนกว่าจะเท่ากับวิธีที่สอง สันนิษฐานว่าในที่สุดจะพบกัน
กำหนดช่วงคลาสเอง
ส่วนใหญ่คุณจะใช้ช่วงตัวเลขและอักขระ แต่ก็ยังดีที่จะรู้ว่าคุณจะใช้ช่วงในคลาสที่กำหนดเองได้อย่างไร
ตัวอย่าง :
คลาส LetterMultiplier attr_reader :count include Comparable def initialize(letter, count) @letter =letter @count =count end def succ self.class.new(@letter, @count + 1) end def <=>(other) count <=> other.count endenda =LetterMultiplier.new('w', 2)b =LetterMultiplier.new('w', 8)# พิมพ์อาร์เรย์ที่มีรายการทั้งหมดใน rangep Array(a..b)ก่อน>กุญแจสำคัญที่นี่คือเพื่อให้แน่ใจว่าคุณใช้
<=>
&succ
วิธีการอย่างถูกต้องหากคุณต้องการใช้
include?
วิธีที่คุณต้องรวมComparable
โมดูลซึ่งเพิ่มวิธีการเช่น==
,<
และ>
(ทั้งหมดขึ้นอยู่กับผลลัพธ์ของ<=>
วิธีการ)บทสรุป
ในบทความนี้ คุณได้เรียนรู้ว่าช่วงทำงานอย่างไรใน Ruby เพื่อให้คุณเข้าใจได้ดีขึ้นและใช้ออบเจกต์ของคุณเองที่รองรับการทำงานของช่วง
อย่าลืมสมัครรับจดหมายข่าวด้านล่างเพื่อไม่ให้พลาดโพสต์ต่อไป 🙂