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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- คลาสฐานและการออกแบบตัวสร้าง
- การสืบทอดหลายระดับ
- การประกอบมิกซินและการตรวจสอบอินเทอร์เฟซ
- instanceof และการตรวจสอบชนิดข้อมูล