บทความนี้เกี่ยวกับ attribute accessors (attr_accessor) ใน Ruby
หากคุณรีบ ให้เลื่อนลงไป
เพราะผมอยากเริ่มต้นด้วยการอธิบาย:
ทำไมเราถึงใช้ attribute accessors!
สมมติว่าคุณมีคลาสที่มีตัวแปรอินสแตนซ์ และต้องการเปิดเผยให้โลกภายนอกเข้าถึง
ทำอย่างไร?
คุณต้องนิยามเมธอด
เพราะเฉพาะเมธอดเท่านั้นที่เข้าถึงตัวแปรอินสแตนซ์ได้
ทำไม?
เพราะคุณจะได้ error หากไม่ทำเช่นนี้
ตัวอย่าง:
class Food
def initialize(protein)
@protein = protein
end
end
bacon = Food.new(21)
bacon.protein # NoMethodError: undefined method `protein'
NoMethodError คือ error ที่คุณได้เมื่อขอค่า protein โดยไม่มีการตั้งค่าที่ถูกต้อง
วิธีแก้คืออะไร?
คุณสามารถนิยามเมธอดของตัวเองได้แบบนี้:
class Food
def protein
@protein
end
end
bacon.protein # 21
ในภาษา OOP อื่นๆ เรียกว่าเมธอด "getter" คุณนิยามเมธอดที่ดึงค่าตัวแปรอินสแตนซ์ให้
คุณอาจอยากเปลี่ยนค่าด้วย
สำหรับนั้น คุณต้องการอีกเมธอดหนึ่ง แบบนี้:
class Food
def protein=(value)
@protein = value
end
end
bacon.protein = 25
จินตนาการว่าคุณเปิดพอร์ทัลเข้าไปในออบเจกต์ เพื่อให้คุณเปลี่ยนค่าได้
นั่นคือสิ่งที่มันทำ
ตอนนี้:
มีวิธีที่ดีกว่านี้ในการนิยามเมธอดแบบนี้ไหม?
แบบ shortcut อะไรสักอย่าง?
มีครับ! 🙂
นั่นคือที่มาของ attr_accessor
ตัวอย่าง Ruby attr_accessor
คุณสามารถสั่งให้ Ruby สร้างเมธอดเหล่านี้ให้ด้วย attr_accessor
วิธีทำ:
class Food
attr_accessor :protein
def initialize(protein)
@protein = protein
end
end
ดูบรรทัดนี้:
attr_accessor :protein
นี่คือเมธอด Ruby ที่สร้างเมธอดอื่นๆ ให้คุณ
เมธอดอะไรบ้าง?
สำหรับตัวอย่างนี้ สร้าง:
proteinprotein=
นี่คือเมธอดเดียวกับที่เราสร้างก่อนหน้านี้…
แต่ตอนนี้คุณไม่ต้องพิมพ์เอง
มันคือ shortcut!
attr_accessor เทียบกับ attr_reader
นอกจาก attr_accessor แล้ว ยังมี accessor อื่นๆ อีก
สามตัวพอดี:
attr_accessorattr_readerattr_writer
ความแตกต่างคืออะไร?
ที่ attr_accessor สร้างทั้ง READER และ WRITER
attr_readerสร้างเฉพาะ readerattr_writerสร้างเฉพาะ writer
กล่าวอีกนัยหนึ่ง:
กับ attr_reader คุณอ่านค่าได้แต่เปลี่ยนไม่ได้ กับ attr_writer คุณเปลี่ยนค่าได้แต่อ่านไม่ได้
ตัวแปรอินสแตนซ์หลายตัว
อยากนิยาม attribute methods หลายตัว?
ทำได้
แต่ต้องใช้ไวยากรณ์ที่ถูกต้อง
แบบนี้:
attr_reader :name, :value, :ready?
คุณสร้างได้ไม่จำกัดจำนวน
ดูวิดีโอสอน
สรุป
คุณเรียนรู้เกี่ยวกับ attribute accessors ใน Ruby แล้ว! ชุดของ 3 เมธอด (attr_accessor, attr_writer และ attr_reader) เพื่อเข้าถึงและตั้งค่าตัวแปรอินสแตนซ์จากนอกคลาส
ตอนนี้ถึงเวลาฝึกฝนแล้ว