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

วิธีการมอบหมายวิธีการใน Ruby &Ruby บน Rails

บทความนี้เกี่ยวกับการมอบหมายเมธอดใน Ruby

คุณจะได้เรียนรู้วิธีการใช้ delegate วิธีการ Forwardable โมดูล &SimpleDelegator ชั้นเรียน

ทำไมเราถึงต้องการ การมอบหมาย ?

ใน Object-Oriented Programming มีสองวิธีในการทำงานร่วมกันของชั้นเรียน

พวกเขา :

  • มรดก
  • องค์ประกอบ

ด้วยการสืบทอด คุณจะสร้างลำดับชั้นของคลาส โดยที่คลาสพาเรนต์แชร์เมธอด ค่าคงที่ และคำจำกัดความของตัวแปรอินสแตนซ์กับคลาสใดๆ ที่สืบทอดมาจากคลาสนั้น

ตัวอย่างเช่น :

ใน Ruby ทุกอ็อบเจ็กต์สืบทอดมาจาก Object คลาสตามค่าเริ่มต้น

นั่นคือเหตุผลที่คุณเข้าถึงวิธีการต่างๆ เช่น puts , class &object_id .

ด้วยการจัดองค์ประกอบ คลาสจะสร้าง (หรือได้รับ) อ็อบเจ็กต์จากคลาสอื่น… จากนั้นคลาสจะใช้ออบเจกต์เหล่านี้เพื่อมอบหมายงานให้กับคลาสเหล่านั้น

ตัวอย่างเช่น :

คอมพิวเตอร์ถูกสร้างขึ้นจากหลายส่วน (วัตถุ) และแต่ละส่วนก็รู้วิธีทำสิ่งหนึ่งได้ดี

หากคุณต้องการแสดงบางอย่างบนหน้าจอ คอมพิวเตอร์จะบอกการ์ดแสดงผลว่าจะแสดงอะไร แต่จะไม่แสดงวิธีการ

นั่นคือ องค์ประกอบ !

แต่ถ้าคุณเป็นคอมพิวเตอร์และต้องการให้สิทธิ์การเข้าถึงวิธีการ์ดแสดงผลล่ะ

คุณต้องสร้าง "สะพาน" ระหว่างพวกเขา

เรามาดูวิธีการทำกัน

การมอบหมายวิธีการทับทิม – ตัวอย่าง

เรามีสองคลาส:

  • Computer
  • Memory

ให้รหัสต่อไปนี้ :

class Computer
  def initialize
    @memory = Memory.new
  end
end

class Memory
  def initialize
    @data = []
  end

  def write(data)
    @data << data
  end

  def read(index)
    @data[index]
  end
end

computer = Computer.new

เราต้องการที่จะสามารถเข้าถึงหน่วยความจำผ่าน Computer .

อาจเป็นได้จากหลายสาเหตุ :

  • คุณมีหน่วยความจำเพียง 1 หน่วย นั่นหมายความว่าคุณต้องการเพียงวัตถุหน่วยความจำ 1 รายการเท่านั้น ด้วยการรวมศูนย์การเข้าถึงไว้ในวัตถุเดียว คุณสามารถบรรลุสิ่งนั้นได้
  • คุณต้องการควบคุมว่าใครสามารถเข้าถึงหน่วยความจำ (แอปพลิเคชันต่างๆ) และหน่วยความจำส่วนใดที่พวกเขาสามารถใช้ได้
  • คุณต้องการบันทึกการเข้าถึงหน่วยความจำทั้งหมดเพื่อความปลอดภัยหรือการดีบัก

ตอนนี้ ถ้าคุณพยายามทำสิ่งนี้ :

computer.write("rubyguides")

มันจะล้มเหลวด้วย NoMethodError เพราะไม่มี write วิธีการใน Computer .

undefined method `write' for #<Computer:0x000055c2e8f7d310> (NoMethodError)

Computer ชั้นเรียนไม่รู้ว่าคุณหมายถึงอะไรโดย write .

เว้นแต่...

คุณสร้าง write วิธีการ!

ตามนี้ :

class Computer
  def initialize
    @memory = Memory.new
  end

  def write(data)
    @memory.write(data)
  end

  def read(index)
    @memory.read(index)
  end
end

เรากำลังส่งคำขอไปยัง @memory วัตถุ

นั่นคือการมอบหมายเมธอด

หมายเหตุ :วิธีนี้ทำให้วิธีการเหล่านี้เป็นส่วนหนึ่งของอินเทอร์เฟซสาธารณะของคุณ (ทุกคนสามารถใช้ได้) และคุณไม่ต้องการแบบนั้นเสมอไป

มีทางลัดสำหรับการมอบหมายเมธอดบางประเภทหรือไม่ ?

ใช่!

มาดูกัน...

วิธีใช้โมดูลที่ส่งต่อได้

ตอนนี้ :

คุณสามารถใช้ Forwardable โมดูลที่มาพร้อมกับ Ruby เพื่อกำหนดวิธีการมอบหมาย

ใช้งานได้แบบนี้ :

require 'forwardable'

class Computer
  extend Forwardable

  def_delegators :@memory, :read, :write

  def initialize
    @memory = Memory.new
  end
end

วิธีนี้ทำให้คุณสามารถลบวิธีการที่เราสร้างไว้ก่อนหน้านี้และจะทำสิ่งเดียวกัน

Forwardable จะดูแลอาร์กิวเมนต์ของเมธอด (รวมถึงบล็อคด้วย!) ให้กับคุณ ดังนั้นคุณจึงไม่ต้องกังวลเรื่องนี้

ไม่ดีเหรอ? 🙂

วิธีใช้งาน Rails Delegate Method

หากคุณใช้ Rails หรือ ActiveSupport gem เพียงอย่างเดียว แสดงว่าคุณสามารถเข้าถึง delegate วิธีการ

นี่คือวิธีการทำงาน :

class Computer
  delegate :read, :write, to: :@memory

  def initialize
    @memory = Memory.new
  end
end

delegate เมธอดใช้ prefix อาร์กิวเมนต์ ซึ่งช่วยให้คุณสามารถเพิ่มคำนำหน้าชื่อเมธอดได้

ตัวอย่าง :

class Computer
  delegate :read, :write, prefix: "memory", to: :@memory

  def initialize
    @memory = Memory.new
  end
end

ได้สองวิธี :

  • memory_read
  • memory_write

วิธีการมอบหมายทุกอย่างด้วย SimpleDelegator

เทคนิคที่คุณเพิ่งเรียนรู้เหล่านี้ใช้เพื่อส่งต่อหรือมอบหมายวิธีการเฉพาะ

แต่ถ้าคุณต้องการห่อวัตถุ &แสดงวิธีการทั้งหมด...

คุณสามารถใช้ SimpleDelegator คลาส!

ตามนี้ :

require 'delegate'

class CoolArray < SimpleDelegator
end

cool = CoolArray.new([])

cool << "ruby"
cool << "gems"

p cool

ตอนนี้ CoolArray ทำตัวเหมือนวัตถุที่คุณส่งไปยัง new .

ทำไมสิ่งนี้จึงมีประโยชน์

คุณสามารถเพิ่มวิธีการใหม่ให้กับวัตถุนี้โดยไม่ต้องเปลี่ยนคลาสเดิม

วิดีโอสอน

สรุป

คุณได้เรียนรู้เกี่ยวกับองค์ประกอบของวัตถุใน Ruby และวิธีมอบหมายวิธีโดยใช้เทคนิคต่างๆ!

หากคุณชอบบทความนี้ โปรด แชร์ กับเพื่อนทับทิมของคุณ

ขอบคุณที่อ่านนะคะ 🙂