Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

Ruby Ranges:ทำงานอย่างไร?

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 เพื่อให้คุณเข้าใจได้ดีขึ้นและใช้ออบเจกต์ของคุณเองที่รองรับการทำงานของช่วง

อย่าลืมสมัครรับจดหมายข่าวด้านล่างเพื่อไม่ให้พลาดโพสต์ต่อไป 🙂