"प्रथम श्रेणी" ऑब्जेक्ट क्या हैं?


191

जब वस्तुओं या कुछ और को किसी दिए गए प्रोग्रामिंग भाषा में "प्रथम श्रेणी" कहा जाता है, और क्यों? वे उन भाषाओं से अलग क्या करते हैं जहाँ वे नहीं हैं?

संपादित करें। जब कोई कहता है कि "सब कुछ एक वस्तु है" (जैसे पायथन), तो क्या वास्तव में उसका मतलब है कि "सब कुछ प्रथम श्रेणी का है"?


1
क्या इस प्रश्न को प्रोग्रामर के पास भेजना संभव होगा। या यह भी एक मिसफिट होगा? मुझे लगता है कि यह सवाल अच्छा है। बस यह कहने में सक्षम नहीं है कि कौन सा मंच इसे सबसे अच्छा सूट करेगा।
शशांक सावंत

16
फिर से खोलने की कोशिश की ... दुख की बात है कि यह वास्तव में ऐसा लगता है जैसे यह उन लोगों द्वारा बंद किया गया था जो कार्यक्रम नहीं करते हैं, यह स्पष्ट रूप से विषय पर है: /
djechlin

जवाबों:


176

संक्षेप में, इसका मतलब है कि वस्तु के उपयोग पर कोई प्रतिबंध नहीं है। यह किसी भी अन्य वस्तु के समान है।

एक प्रथम श्रेणी की वस्तु एक इकाई है जिसे गतिशील रूप से बनाया जा सकता है, नष्ट किया जा सकता है, एक फ़ंक्शन को पास किया जा सकता है, एक मान के रूप में लौटाया जा सकता है, और प्रोग्रामिंग भाषा में अन्य चर के रूप में सभी अधिकार हैं।

भाषा के आधार पर, इसका अर्थ यह हो सकता है:

  • अनाम शाब्दिक मूल्य के रूप में व्यक्त किया जा रहा है
  • चरों में स्थिर होना
  • डेटा स्ट्रक्चर्स में स्ट्रांग होना
  • आंतरिक पहचान (किसी भी नाम से स्वतंत्र)
  • अन्य संस्थाओं के साथ समानता के लिए तुलनीय है
  • एक प्रक्रिया / कार्य के लिए एक पैरामीटर के रूप में पास होने योग्य
  • एक प्रक्रिया / कार्य के परिणाम के रूप में वापस किया जा रहा है
  • रनटाइम में रचनात्मक होने के नाते
  • प्रिंट करने योग्य है
  • पठनीय है
  • वितरित प्रक्रियाओं के बीच संप्रेषणीय होना
  • बाहर चल रही प्रक्रियाओं के रूप में प्यारा

स्रोत

C ++ फ़ंक्शंस में स्वयं प्रथम श्रेणी की वस्तुएँ नहीं हैं, हालाँकि:

  • आप '()' ऑपरेटर को ऑब्जेक्ट फ़ंक्शन के लिए संभव बनाते हुए ओवरराइड कर सकते हैं, जो कि प्रथम श्रेणी है।
  • कार्य बिंदु प्रथम श्रेणी हैं।
  • बढ़ावा बाँध, लैम्ब्डा और फ़ंक्शन करते हैं जो प्रथम श्रेणी के कार्यों की पेशकश करते हैं

C ++ में, कक्षाएं प्रथम श्रेणी की वस्तुएं नहीं हैं, बल्कि उन कक्षाओं के उदाहरण हैं। पायथन में दोनों वर्ग और वस्तुएं प्रथम श्रेणी की वस्तुएं हैं। ( वस्तुओं के रूप में कक्षाओं के बारे में अधिक विवरण के लिए यह उत्तर देखें )।

यहाँ जावास्क्रिप्ट प्रथम श्रेणी के कार्यों का एक उदाहरण दिया गया है:

// 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 ++ में फ़ंक्शंस दूसरी श्रेणी के हैं क्योंकि वे गतिशील रूप से नहीं बनाए जा सकते हैं।

संपादन के बारे में:

संपादित करें। जब कोई कहता है कि "सब कुछ एक वस्तु है" (जैसे पायथन), तो क्या वास्तव में उसका मतलब है कि "सब कुछ प्रथम श्रेणी का है"?

ऑब्जेक्ट शब्द का उपयोग शिथिल रूप से किया जा सकता है और इसका मतलब यह नहीं है कि यह प्रथम श्रेणी है। और संभवत: पूरी अवधारणा को 'प्रथम श्रेणी संस्थाएं' कहना अधिक समझदारी होगी। लेकिन पायथन में वे सब कुछ प्रथम श्रेणी बनाने का लक्ष्य रखते हैं। मेरा मानना ​​है कि उस व्यक्ति की मंशा जिसने आपके बयान को प्रथम श्रेणी में रखा है।


2
क्या आप वस्तुओं के कुछ उदाहरण दे सकते हैं जो 'प्रथम श्रेणी' नहीं हैं?
सुदीप भंडारी

1
@SudipBhandari मैं एक ही बात सोच रहा था, अंत में इस विषय पर मददगार विकिपीडिया लेख पर ठोकर खाई: प्रथम श्रेणी के नागरिक या वस्तु । मुझे विशेष रूप से उपयोगी रॉबिन पॉपप्लेस्टोन की परिभाषा मिली। (Btw, एक WP लेख पोस्टिंग सुपर स्पष्ट लग सकता है, लेकिन मुझे नहीं पता था कि यह एक मौलिक प्रोग्रामिंग भाषा अवधारणा थी)
mblakesley

19

"जब कोई कहता है कि" सब कुछ एक वस्तु है "(जैसे पायथन), तो क्या उसका वास्तव में मतलब है कि" सब कुछ प्रथम श्रेणी का है? "

हाँ।

अजगर में सब कुछ एक उचित वस्तु है। यहां तक ​​कि ऐसी चीजें जो अन्य भाषाओं में "आदिम प्रकार" हैं।

आप पाते हैं कि 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__']

क्योंकि सब कुछ पायथन में एक प्रथम श्रेणी की वस्तु है, वहाँ अपेक्षाकृत कुछ अस्पष्ट विशेष मामले हैं।

जावा में, उदाहरण के लिए, आदिम प्रकार (इंट, बूल, डबल, चार) हैं जो उचित ऑब्जेक्ट नहीं हैं। इसलिए जावा को इंटेगर, बुलियन, डबल और कैरेक्टर को प्रथम श्रेणी के प्रकारों के रूप में पेश करना है। यह शुरुआती लोगों को सिखाना कठिन हो सकता है - यह स्पष्ट नहीं है कि क्यों एक आदिम प्रकार और एक वर्ग दोनों को एक साथ मौजूद होना चाहिए।

इसका अर्थ यह भी है कि एक वस्तु का वर्ग है - स्वयं - एक वस्तु। यह C ++ से अलग है, जहां कक्षाएं हमेशा रन-टाइम पर एक अलग अस्तित्व नहीं रखती हैं।

प्रकार 2एक type 'int'वस्तु है, जिसमें विधियाँ, विशेषताएँ और एक प्रकार है।

>>> type(2)
<class 'int'>

के प्रकार निर्मित एक प्रकार की तरह intहै type 'type'वस्तु। इसकी विधियाँ और विशेषताएँ भी हैं।

>>> type(type(2))
<class 'type'>

1
यह आधुनिक पायथन का सच है। पुराने पायथन में (संस्करण 1; यह मेरे समय से पहले था) आपको विरासत में नहीं मिला int। इस प्रकार "पुरानी" बनाम "नई शैली की कक्षाएं" (और 3 में, अब पुरानी शैली की कक्षाएं नहीं हैं)।
कीथ पिंसन

17

"प्रथम श्रेणी" का अर्थ है कि आप उन पर सामान्य तरीके से काम कर सकते हैं। ज्यादातर बार, इसका मतलब यह है कि आप इन प्रथम श्रेणी के नागरिकों को कार्यों के तर्क के रूप में पारित कर सकते हैं, या उन्हें कार्यों से वापस कर सकते हैं।

यह वस्तुओं के लिए स्व-स्पष्ट है लेकिन कार्यों, या कक्षाओं के लिए हमेशा इतना स्पष्ट नहीं है:

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<>एक तर्क के रूप में एक फ़ंक्शन पास करने के लिए एक छोटे से वर्कअराउंड (अर्थात् एक सामान्य प्रतिनिधि कहा जाता है ) का उपयोग करता है । अन्य भाषाएं, जैसे रूबी, यहां तक ​​कि कक्षाओं और कोड ब्लॉकों को भी सामान्य चर के रूप में मानती हैं (या रूबी, स्थिरांक के मामले में)।


17

कंप्यूटर प्रोग्राम की संरचना और व्याख्या में एक स्लाइड से , व्याख्यान 2A (1986), जिसमें क्रिस्टोफर स्ट्रेसन के उद्धरण हैं :

प्रथम श्रेणी के नागरिकों के अधिकार और विशेषाधिकार:

  • चरों द्वारा नामित किया जाना है।
  • प्रक्रियाओं के तर्क के रूप में पारित किया जाना है।
  • प्रक्रियाओं के मूल्यों के रूप में लौटाया जाना।
  • डेटा संरचनाओं में शामिल किया जाना है

1

IMO यह उन उपमाओं में से एक है जिनका उपयोग प्राकृतिक भाषा में चीजों का वर्णन करने के लिए किया जाता है। इस शब्द का प्रयोग अनिवार्य रूप से प्रथम श्रेणी की वस्तुओं के रूप में कार्यों के वर्णन के संदर्भ में किया जाता है।

यदि आप एक वस्तु उन्मुख भाषा पर विचार करते हैं, तो हम वस्तुओं के लिए विभिन्न विशेषताओं को प्रदान कर सकते हैं जैसे: विरासत, वर्ग परिभाषा, कोड के अन्य वर्गों को पास करने की क्षमता (विधि तर्क), डेटा संरचना में स्टोर करने की क्षमता आदि। यदि हम कर सकते हैं। एक ऐसी इकाई के साथ जिसे आमतौर पर एक वस्तु के रूप में नहीं माना जाता है, जैसे जावा स्क्रिप्ट के मामले में कार्य, ऐसी संस्थाएं प्रथम श्रेणी की वस्तु मानी जाती हैं।

यहां पहली कक्षा का अनिवार्य रूप से मतलब है, दूसरी श्रेणी के रूप में नहीं (अपमानित व्यवहार के साथ)। अनिवार्य रूप से मॉकिंग सही या अप्रभेद्य है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.