วัตถุหรือสิ่งอื่นใดที่กล่าวว่าเป็น "ชั้นหนึ่ง" ในภาษาการเขียนโปรแกรมที่กำหนดและทำไม? พวกเขาแตกต่างจากภาษาในที่ใดบ้าง
แก้ไข เมื่อมีคนพูดว่า "ทุกอย่างเป็นวัตถุ" (เหมือนใน Python) จริง ๆ แล้วเขาหมายความว่า "ทุกอย่างเป็นชั้นหนึ่ง" หรือไม่?
วัตถุหรือสิ่งอื่นใดที่กล่าวว่าเป็น "ชั้นหนึ่ง" ในภาษาการเขียนโปรแกรมที่กำหนดและทำไม? พวกเขาแตกต่างจากภาษาในที่ใดบ้าง
แก้ไข เมื่อมีคนพูดว่า "ทุกอย่างเป็นวัตถุ" (เหมือนใน Python) จริง ๆ แล้วเขาหมายความว่า "ทุกอย่างเป็นชั้นหนึ่ง" หรือไม่?
คำตอบ:
กล่าวโดยย่อก็หมายความว่าไม่มีข้อ จำกัด ในการใช้งานของวัตถุ มันเหมือนกับวัตถุอื่น ๆ
วัตถุชั้นหนึ่งเป็นเอนทิตีที่สามารถสร้างทำลายส่งผ่านไปยังฟังก์ชันส่งคืนเป็นค่าและมีสิทธิ์ทั้งหมดตามที่ตัวแปรอื่น ๆ ในภาษาการเขียนโปรแกรมมีอยู่
ขึ้นอยู่กับภาษาซึ่งสามารถบ่งบอกถึง:
- การแสดงออกเป็นค่าตามตัวอักษรนิรนาม
- สามารถจัดเก็บได้ในตัวแปร
- สามารถจัดเก็บได้ในโครงสร้างข้อมูล
- มีตัวตนที่แท้จริง (เป็นอิสระจากชื่อที่กำหนด)
- เปรียบเทียบได้กับความเสมอภาคกับหน่วยงานอื่น
- ผ่านได้เป็นพารามิเตอร์ในขั้นตอน / ฟังก์ชั่น
- สามารถส่งคืนได้เนื่องจากผลลัพธ์ของขั้นตอน / ฟังก์ชัน
- เป็น constructible ที่รันไทม์
- พิมพ์ได้
- สามารถอ่านได้
- ถูกถ่ายทอดระหว่างกระบวนการกระจาย
- สามารถจัดเก็บได้นอกกระบวนการทำงาน
ในฟังก์ชั่น C ++ ตัวเองไม่ใช่วัตถุชั้นหนึ่งอย่างไรก็ตาม:
ใน C ++ คลาสไม่ได้เป็นวัตถุคลาสแรก แต่อินสแตนซ์ของคลาสเหล่านั้นคือ ใน Python ทั้งคลาสและวัตถุเป็นวัตถุชั้นหนึ่ง (ดูคำตอบนี้สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับคลาสเป็นวัตถุ)
นี่คือตัวอย่างของฟังก์ชั่นชั้นหนึ่งของ Javascript:
// f: function that takes a number and returns a number
// deltaX: small positive number
// returns a function that is an approximate derivative of f
function makeDerivative( f, deltaX )
{
var deriv = function(x)
{
return ( f(x + deltaX) - f(x) )/ deltaX;
}
return deriv;
}
var cos = makeDerivative( Math.sin, 0.000001);
// cos(0) ~> 1
// cos(pi/2) ~> 0
หน่วยงานที่ไม่ใช่วัตถุชั้นหนึ่งเรียกว่าวัตถุชั้นสอง ฟังก์ชันใน C ++ เป็นคลาสที่สองเนื่องจากไม่สามารถสร้างแบบไดนามิกได้
เกี่ยวกับการแก้ไข:
แก้ไข เมื่อมีคนพูดว่า "ทุกอย่างเป็นวัตถุ" (เหมือนใน Python) จริง ๆ แล้วเขาหมายความว่า "ทุกอย่างเป็นชั้นหนึ่ง" หรือไม่?
คำว่าวัตถุสามารถใช้ได้อย่างอิสระและไม่ได้หมายความว่าเป็นชั้นหนึ่ง และมันอาจจะเหมาะสมกว่าที่จะเรียกแนวคิดทั้งหมดว่า 'เอนทิตีชั้นหนึ่ง' แต่ใน Python พวกเขาตั้งเป้าที่จะทำให้ทุกอย่างเป็นที่หนึ่ง ฉันเชื่อว่าความตั้งใจของคนที่ทำให้คำพูดของคุณหมายถึงชั้นหนึ่ง
"เมื่อมีคนบอกว่า" ทุกอย่างเป็นวัตถุ "(เหมือนใน Python) จริงๆแล้วเขาหมายถึง" ทุกอย่างเป็นชั้นหนึ่ง "หรือไม่
ใช่.
ทุกอย่างใน Python เป็นวัตถุที่เหมาะสม แม้แต่สิ่งที่เป็น "ประเภทดั้งเดิม" ในภาษาอื่น
คุณพบว่าวัตถุเช่นนั้น 2
แท้จริงมีส่วนต่อประสานที่ค่อนข้างสมบูรณ์และซับซ้อน
>>> dir(2)
['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__str__', '__sub__', '__truediv__', '__xor__']
เนื่องจากทุกอย่างเป็นวัตถุชั้นหนึ่งใน Python จึงมีกรณีพิเศษค่อนข้างคลุมเครือ
ตัวอย่างเช่นใน Java มีประเภทดั้งเดิม (int, bool, double, char) ที่ไม่ใช่วัตถุที่เหมาะสม นั่นเป็นเหตุผลที่ Java ต้องแนะนำ Integer, Boolean, Double และ Character เป็นประเภทเฟิร์สคลาส นี่อาจเป็นเรื่องยากที่จะสอนให้กับผู้เริ่มต้น - มันไม่ชัดเจนว่าทำไมทั้งประเภทดั้งเดิมและคลาสต้องอยู่เคียงข้างกัน
นอกจากนี้ยังหมายความว่าคลาสของวัตถุคือ - ตัวเอง - วัตถุ สิ่งนี้แตกต่างจาก C ++ โดยที่คลาสไม่ได้มีอยู่จริง ณ เวลาทำงาน
ประเภทของ2
คือtype 'int'
วัตถุซึ่งมีวิธีการคุณลักษณะและประเภท
>>> type(2)
<class 'int'>
ประเภทของประเภทในตัวชอบint
เป็นtype 'type'
วัตถุ นี้มีวิธีการและคุณสมบัติเช่นกัน
>>> type(type(2))
<class 'type'>
int
ต่อได้ ดังนั้นคลาส "เก่า" และ "คลาสใหม่" (และใน 3 ไม่มีคลาสคลาสเก่าอีกต่อไป)
“ ชั้นหนึ่ง” หมายความว่าคุณสามารถใช้งานมันได้ตามปกติ ส่วนใหญ่แล้วนี่หมายความว่าคุณสามารถส่งผ่านพลเมืองชั้นหนึ่งเหล่านี้เป็นข้อโต้แย้งไปยังฟังก์ชั่นหรือคืนพวกเขาจากฟังก์ชั่น
สิ่งนี้มีความชัดเจนในตัวเองสำหรับวัตถุ แต่ไม่ชัดเจนสำหรับฟังก์ชั่นหรือแม้กระทั่งคลาส:
void f(int n) { return n * 2; }
void g(Action<int> a, int n) { return a(n); }
// Now call g and pass f:
g(f, 10); // = 20
นี่คือตัวอย่างใน C # ที่ฟังก์ชั่นไม่ใช่วัตถุชั้นหนึ่ง รหัสด้านบนจึงใช้วิธีแก้ปัญหาเล็ก ๆ (คือตัวแทนทั่วไปที่เรียกว่าAction<>
) เพื่อส่งผ่านฟังก์ชั่นเป็นอาร์กิวเมนต์ ภาษาอื่น ๆ เช่นทับทิมอนุญาตให้รักษาคลาสได้และบล็อคโค้ดเป็นตัวแปรปกติ (หรือในกรณีของ Ruby ค่าคงที่)
จากสไลด์ในโครงสร้างและการแปลความหมายของโปรแกรมคอมพิวเตอร์บรรยาย 2A (1986) ซึ่งจะเสนอราคาChristopher Stracey :
สิทธิและเอกสิทธิ์ของพลเมืองชั้นหนึ่ง:
IMO นี่เป็นหนึ่งในคำอุปมาอุปมัยที่ใช้อธิบายสิ่งต่าง ๆ ในภาษาธรรมชาติ คำที่ใช้เป็นหลักในบริบทของการอธิบายฟังก์ชั่นเป็นวัตถุชั้นหนึ่ง
หากคุณพิจารณาภาษาเชิงวัตถุเราสามารถถ่ายทอดคุณสมบัติที่หลากหลายให้กับวัตถุเช่น: การสืบทอดการกำหนดคลาสความสามารถในการส่งผ่านไปยังส่วนอื่น ๆ ของรหัส (อาร์กิวเมนต์เมธอด) ความสามารถในการจัดเก็บในโครงสร้างข้อมูลเป็นต้นหากเราสามารถทำได้ เช่นเดียวกับเอนทิตีที่ไม่ปกติถือว่าเป็นวัตถุเช่นฟังก์ชั่นในกรณีของจาวาสคริปต์เอนทิตีดังกล่าวถือเป็นวัตถุชั้นหนึ่ง
ชั้นหนึ่งโดยพื้นฐานแล้วหมายถึงไม่ได้รับการจัดการเป็นชั้นที่สอง (ที่มีพฤติกรรมเสื่อมโทรม) โดยพื้นฐานแล้วการเยาะเย้ยนั้นสมบูรณ์แบบหรือแยกไม่ออก