อยากเรียน Instance Variables ใน Ruby — ทำงานยังไง ทำไมถึงสำคัญ — มาที่ถูกแล้ว!
คำถามแรก... Instance Variable คืออะไร?
ใน Ruby Instance Variable คือ Variable ที่ขึ้นต้นด้วย @ Symbol
ตัวอย่าง: @fruit
Instance Variable ใช้ใน OOP ให้ Objects มี Private Space เก็บ Data
เราบอกว่า Objects สามารถ:
- Do things (ทำสิ่งต่างๆ)
- Know things (รู้สิ่งต่างๆ)
Methods ทำให้สิ่งต่างๆ เกิดขึ้น — พวกมัน DO Things
Instance Variables เก็บ Data — พวกมัน KNOW Things
ตัวอย่าง: Class Fruit อยากรู้ชนิด สี น้ำหนัก — ทั้งหมดกลายเป็น Instance Variables: @color, @type, @weight
ต่อไป: มาดู Code Examples
วิธี Define และ Use Ruby Instance Variables
Define Instance Variables ภายใน Classes
ตัวอย่าง: Class CoffeeMachine — ต้องการน้ำ ต้องรู้เหลือเท่าไหร่
ทำได้แบบนี้:
class CoffeeMachine
def initialize
@water = 100
end
end
@water = Instance Variable — กำหนด 100 เป็น Initial Value
ตอนนี้: เมธอด make_coffee ลดน้ำในถัง
class CoffeeMachine
def initialize
@water = 100
end
def make_coffee
@water -= 10
end
end
สังเกต: ทุก CoffeeMachine Object ที่สร้าง (new) จะมี @water Private ของตัวเอง — สมเหตุสมผล เพราะเครื่องกาแฟ 10 เครื่อง น้ำแต่ละเครื่องต่างกัน!
นั่นคือเหตุผลที่用 Instance Variables!
วิธี Access Instance Variables
Instance Variables ไม่ประโยชน์ถ้าอ่านค่าปัจจุบันไม่ได้ — 讀ค่าได้ด้วย @ Syntax
แบบนี้:
class CoffeeMachine
def initialize
@water = 50
end
def print_water_level
puts "Water Level: #{@water}"
end
end
machine = CoffeeMachine.new
machine.print_water_level # Water Level: 50
print_water_level ใช้ @water พิมพ์ค่า
ใช้ Attribute Accessors
สังเกตว่า Instance Variables เข้าถึงจาก นอก Class ไม่ได้ — Design นี้!
เรียกว่า "Encapsulation" — Data ของ Object ป้องกันจาก Outside World (Objects อื่น)
เช่นนี้:
machine = CoffeeMachine.new
machine.water # NoMethodError: undefined method `water'
machine.@water # SyntaxError: unexpected tIVAR, expecting '('
บางครั้งอยาก Allow — เปิด "หน้าต่าง" ให้ Data เข้าถึงจากนอกได้
วิธีหนึ่ง:
class CoffeeMachine
def initialize
@water = 100
end
def water
@water
end
end
machine = CoffeeMachine.new
machine.water # 100
ไม่มีอะไรพิเศษ — Return ค่าจากใน (ที่เข้าถึงได้)
อีกทางคือ Attribute Reader:
class CoffeeMachine
attr_reader :water
def initialize
@water = 100
end
end
machine = CoffeeMachine.new
machine.water # 100
เหมือนกัน — แต Ruby สร้าง Method water ให้อัตโนมัติ
สิ่งที่ควรทราบ
จดไว้กันลืม:
- Undefined Instance Variable คืน
nilเสมอ - Instance Variables ไม่บังคับสร้างใน
initializeแต่นั่นคือวิธีให้ Initial Value - มี Advanced Ways เข้าถึง เช่น
instance_variable_getแตควรหลีกเลี่ยง
Btw ดู List Instance Variables ได้:
machine.instance_variables # [:@water]
อาจช่วยได้ 🙂
อีกอย่าง: ใน Rails Instance Variables (@books) ใช้ Share Data ระหว่าง Controller และ Views — แตยัง用ได้ปกติสำหรับ Classes ของคุณ
Summary (สรุป)
คุณเรียนรู้ Ruby Instance Variables! Variable เริ่ม @ ใช้ใน Classes ให้มีที่เก็บ Data
อย่าลืม Practice เล่น Code Examples สร้างเอง — ขอบคุณที่อ่านครับ