Data vs Struct

การสร้าง data structure ขึ้นมาเพื่อใช้สำหรับเก็บข้อมูลเป็นสิ่งที่หลีกเลี่ยงไม่ได้ซึ่งการเลือกว่าจะใช้อะไรนั้นก็ขึ้นอยู่กับเหตุการณ์ และความต้องการ โดยในบทความนี้จะยกตัวอย่างระหว่าง Data และ Struct ขึ้นมาเปรียบเทียบให้ดูกัน

ทำความเข้าใจ Data และ Struct

Struct เป็น class ที่ทำให้เราสามารถสร้าง class อย่างง่ายเพื่อใช้เก็บและดึงค่าของข้อมูลได้ โดย Struct เองอนุญาตให้เราสามารถแก้ไขข้อมูลได้ด้วย เราจะเห็นได้ว่า Struct ได้จัดเตรียม getter และ setter ให้กับตัวแปลที่เราส่งผ่านเข้าไปนั้นเอง

User = Struct.new('User', :first_name, :last_name, :age)
# or User = Struct.new(:first_name, :last_name, :age)

User.instance_methods(false)
# [:last_name, :first_name, :first_name=, :last_name=]

Data เป็น class ที่เพิ่งถูกนำเข้ามาใน Ruby 3.2 ซึ่งเป็น data structure ที่ไม่สามารถแก้ไขข้อมูลได้ (immutable) แต่สามารถรับ optional block เพื่อเพิ่มเติมความสามารถให้กับ class ได้

User = Data.define(:first_name, :last_name, :age) do
  def fullname
    "#{self.first_name} #{self.last_name}"
  end
end

User.instance_methods(false)
# [:first_name, :last_name, :age, :fullname]

ถ้าลองสังเกตผลลัพท์ของ instance_methods ที่ได้ออกมาจะเห็นได้ว่า Struct จะมี getter ออกมาด้วย ส่วน ของ Data จะไม่มี getter แต่จะมี fullname ที่เราได้ทำการเพิ่มเข้าไปแสดงออกมา