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

เชี่ยวชาญ Ruby Attribute Accessors: ใช้ attr_accessor, attr_writer และ attr_reader

บทความนี้เกี่ยวกับ 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 ที่สร้างเมธอดอื่นๆ ให้คุณ

เมธอดอะไรบ้าง?

สำหรับตัวอย่างนี้ สร้าง:

  • protein
  • protein=

นี่คือเมธอดเดียวกับที่เราสร้างก่อนหน้านี้…

แต่ตอนนี้คุณไม่ต้องพิมพ์เอง

มันคือ shortcut!

attr_accessor เทียบกับ attr_reader

นอกจาก attr_accessor แล้ว ยังมี accessor อื่นๆ อีก

สามตัวพอดี:

  • attr_accessor
  • attr_reader
  • attr_writer

ความแตกต่างคืออะไร?

ที่ attr_accessor สร้างทั้ง READER และ WRITER

  • attr_reader สร้างเฉพาะ reader
  • attr_writer สร้างเฉพาะ writer

กล่าวอีกนัยหนึ่ง:

กับ attr_reader คุณอ่านค่าได้แต่เปลี่ยนไม่ได้ กับ attr_writer คุณเปลี่ยนค่าได้แต่อ่านไม่ได้

ตัวแปรอินสแตนซ์หลายตัว

อยากนิยาม attribute methods หลายตัว?

ทำได้

แต่ต้องใช้ไวยากรณ์ที่ถูกต้อง

แบบนี้:

attr_reader :name, :value, :ready?

คุณสร้างได้ไม่จำกัดจำนวน

ดูวิดีโอสอน

สรุป

คุณเรียนรู้เกี่ยวกับ attribute accessors ใน Ruby แล้ว! ชุดของ 3 เมธอด (attr_accessor, attr_writer และ attr_reader) เพื่อเข้าถึงและตั้งค่าตัวแปรอินสแตนซ์จากนอกคลาส

ตอนนี้ถึงเวลาฝึกฝนแล้ว