มาแชทเกี่ยวกับเมธอด grep
เมธอดนี้ทำอะไรให้คุณได้บ้าง?
คุณสามารถใช้ grep กรอง enumerable objects เช่น Arrays และ Ranges
"แต select ทำได้แล้ว!"
ใช่ แต grep ทำงานต่างออกไปและให้ผลลัพธ์ต่างออกไป
มาดูตัวอย่างกัน
ตัวอย่าง Ruby Grep Method
กำหนดอาร์เรย์นี้:
objects = ["a", "b", "c", 1, 2, 3, nil]
คุณสามารถใช้ grep ดึงเฉพาะ strings:
objects.grep(String) # ["a", "b", "c"]
เฉพาะ Integers:
objects.grep(Integer) # [1, 2, 3]
หรือทุกอย่างที่ไม่ใช่ nil:
objects.grep_v(NilClass) # ["a", "b", "c", 1, 2, 3]
หากมีอาร์เรย์คำ:
fruit = ["apple", "orange", "banana"]
คุณหาคำที่ขึ้นต้นด้วย "a" ได้:
fruit.grep(/^a/) # ["apple"]
หรือลงท้ายด้วย "e":
fruit.grep(/e$/) # ["apple", "orange"]
และหากมีรายการตัวเลข:
numbers = [9, 10, 11, 20]
คุณได้รายการ ตัวเลขทั้งหมดในช่วง:
numbers.grep(5..10) # [9, 10]
คุณรวม map และ select เป็นหนึ่งเดียวได้เมื่อใช้ block:
numbers.grep(5..10) { |n| n * 2 } # [18, 20]
หากอยาก fancy…
times_two = ->(x) { x * 2 }
numbers.grep(5..10, ×_two) # [18, 20]
คุ้มค่ามากใช่ไหม?
Grep vs Select: เข้าใจความแตกต่าง
grep ทำงานอย่างไร?
คีย์อยู่ที่เมธอด === (triple equals) ใน Ruby
Grep เรียกเมธอดนี้บนอาร์กิวเมนต์ที่คุณส่งเข้าไป
และเกิดที่ classes, regular expressions และ ranges ทั้งหมด implement ===
พวกมัน implement เมธอดนี้ในแบบที่สมเหตุสมผลสำหรับคลาส
ตัวอย่าง:
- Classes (เช่น
IntegerหรือArray) เปรียบเทียบกับ class ของออบเจกต์ที่ให้ - Ranges ตรวจสอบว่าตัวเลขอยู่ในช่วงหรือไม่
- Regular expressions ตรวจสอบว่ามี match หรือไม่
ดังนั้นเมื่อคุณพูดว่า:
objects.grep(Integer)
คุณพูดจริงๆ แล้วว่า:
objects.select { |obj| Integer === obj }
นานมากผงงสับสนกับ grep…
จนกว่าจะเข้าใจสิ่งนี้
เมธอด select กรองรายการตามผลลัพธ์ของ block
หาก block evaluate เป็น true element นั้นจะถูกเลือก
แต grep แค่เปรียบเทียบสองสิ่งด้วย ===
คุณอาจพูดว่า grep เป็น version เฉพาะเจาะจงกว่าของ select!
Ruby Grep Mindmap

ดูวิดีโอสอน
สรุป
คุณเรียนรู้เกี่ยวกับ grep method ใน Ruby แล้ว! มันเป็นเมธอดที่ช่วยมากเมื่อคุณเข้าใจว่ามันทำงานอย่างไร
อย่าลืมฝึกฝนเพื่อให้มันซึมซับ
Practice is the key to mastery!