0Pricing
Lua Academy · บทเรียน

instanceof และการตรวจสอบชนิดข้อมูล

สร้างการตรวจสอบ instanceof() ด้วยการไล่ดูโครงสร้างลำดับชั้นของคลาส

instanceof และการตรวจสอบชนิดข้อมูล เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

instanceof คืออะไร

instanceof(obj, Class) ตรวจสอบว่าวัตถุเป็นอินสแตนซ์ของคลาสที่ระบุหรือบรรพบุรุษใด ๆ ของคลาสนั้นหรือไม่ โดยใช้แทน type() แบบพื้นฐานของลัวในระบบเชิงวัตถุ

instanceof แบบง่าย

เดินตามสายเมตาเทเบิลจากอินสแตนซ์ขึ้นไปด้านบน เพื่อค้นหาคลาสเป้าหมาย

local function instanceof(obj, cls)
  if type(obj) ~= "table" then return false end
  local mt = getmetatable(obj)
  while mt do
    if mt == cls then return true end
    local parent = getmetatable(mt)
    mt = parent and parent.__index
  end
  return false
end

การทดสอบ instanceof

ทำงานได้อย่างถูกต้องตลอดสายการสืบทอด

local cat = Animal:new("Cat","Meow")
local rex = Dog:new("Rex")
print(instanceof(rex, Dog))     -- true
print(instanceof(rex, Animal))  -- true
print(instanceof(cat, Dog))     -- false

แบบแผนฟิลด์ __type

เก็บชื่อชนิดข้อมูลเป็นสตริงไว้ในแต่ละคลาส เพื่อให้ตรวจสอบชนิดข้อมูลขณะทำงานได้อย่างรวดเร็ว

Animal.__type = "Animal"
Dog.__type = "Dog"
local function typeOf(obj)
  local mt = getmetatable(obj)
  return mt and mt.__type or type(obj)
end
print(typeOf(rex))  -- Dog

ตัวป้องกันชนิดข้อมูล

สร้างฟังก์ชันตัวป้องกันชนิดข้อมูลเพื่อให้การยืนยันที่ขอบเขตเอพีไออ่านได้สะอาดขึ้น

local function assertType(obj, cls, argName)
  if not instanceof(obj, cls) then
    error(("Expected %s for %s, got %s"):format(
      cls.__name, argName, typeOf(obj)), 2)
  end
end

การใช้เมตาเทเบิลตรวจจับคลาส

getmetatable(obj) ส่งคืนตารางคลาส เปรียบเทียบกับคลาสที่ทราบอยู่แล้วเพื่อตรวจสอบชนิดที่ตรงกันทุกประการ (ไม่รองรับการสืบทอด)

local function exactType(obj)
  return getmetatable(obj)
end
print(exactType(rex) == Dog)  -- true
print(exactType(rex) == Animal)  -- false (not exact)

การตรวจสอบลำดับชั้นคลาส

เดินตามสายเมตาเทเบิลเพื่อแสดงรายชื่อคลาสทั้งหมดที่วัตถุสืบทอดมา

local function classChain(obj)
  local chain = {}
  local mt = getmetatable(obj)
  while mt do
    chain[#chain+1] = mt.__name or "?"
    local parent = getmetatable(mt)
    mt = parent and parent.__index
  end
  return chain
end

การเปรียบเทียบระบบชนิดข้อมูล

type() ในตัวของลัวส่งคืนชนิดข้อมูลพื้นฐานเพียง 8 ชนิด สำหรับระบบเชิงวัตถุ ให้ใช้ instanceof หรือฟังก์ชัน typeOf แบบกำหนดเองที่เข้าใจลำดับชั้นของคลาส

คลาสปิดผนึก

ป้องกันการสร้างคลาสย่อยโดยลบเมธอด :extend() ออกจากคลาส หรือเพิ่มการตรวจสอบใน __index

การกระจายการทำงานตามชนิดข้อมูล

เลือกการเรียกฟังก์ชันตามชนิดข้อมูลขณะทำงาน ซึ่งเป็นทางเลือกน้ำหนักเบาแทนการโอเวอร์โหลดเมธอด

local function process(animal)
  if instanceof(animal, Dog) then
    print("Processing Dog:", animal.name)
  elseif instanceof(animal, Animal) then
    print("Processing Animal:", animal.name)
  end
end

การแก้จุดบกพร่องด้วยข้อมูลชนิดข้อมูล

เพิ่ม __tostring ให้คลาส โดยรวมชื่อชนิดข้อมูลไว้ด้วย เพื่อให้ผลลัพธ์การแก้จุดบกพร่องมีความหมาย

คำถามเรื่อง instanceof

instanceof(rex, Animal) จะส่งคืนอะไร หาก Rex เป็น Dog (ซึ่งสืบทอดจาก Animal)

สรุป: instanceof และการตรวจสอบชนิดข้อมูล

instanceof เดินตามสายเมตาเทเบิลเพื่อตรวจสอบชนิดข้อมูลโดยคำนึงถึงการสืบทอด ใช้ฟิลด์ __type เพื่อค้นหาชนิดข้อมูลแบบสตริงได้อย่างรวดเร็ว ตัวป้องกันชนิดข้อมูลที่ขอบเขตเอพีไอช่วยตรวจพบข้อผิดพลาดด้านชนิดข้อมูลตั้งแต่เนิ่น ๆ พร้อมข้อความที่ชัดเจน

คำถามที่พบบ่อย

บทเรียน “instanceof และการตรวจสอบชนิดข้อมูล” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “instanceof และการตรวจสอบชนิดข้อมูล” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “instanceof และการตรวจสอบชนิดข้อมูล”

สร้างการตรวจสอบ instanceof() ด้วยการไล่ดูโครงสร้างลำดับชั้นของคลาส คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “instanceof และการตรวจสอบชนิดข้อมูล” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม

ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. คลาสฐานและการออกแบบตัวสร้าง
  2. การสืบทอดหลายระดับ
  3. การประกอบมิกซินและการตรวจสอบอินเทอร์เฟซ
  4. instanceof และการตรวจสอบชนิดข้อมูล
← กลับไปที่ Lua Academy