आइए कल्पना करें कि हमारे पास कुछ सदस्य कार्यों के साथ 3 युगल रखने के लिए एक संरचना है:
struct Vector {
double x, y, z;
// ...
Vector &negate() {
x = -x; y = -y; z = -z;
return *this;
}
Vector &normalize() {
double s = 1./sqrt(x*x+y*y+z*z);
x *= s; y *= s; z *= s;
return *this;
}
// ...
};
यह सादगी के लिए थोड़ा विरोधाभास है, लेकिन मुझे यकीन है कि आप सहमत हैं कि समान कोड वहाँ है। उदाहरण के लिए, विधियाँ आपको आसानी से श्रृंखला की अनुमति देती हैं:
Vector v = ...;
v.normalize().negate();
या और भी:
Vector v = Vector{1., 2., 3.}.normalize().negate();
अब अगर हमने शुरू () और अंत () फ़ंक्शन प्रदान किए हैं, तो हम अपने वेक्टर का उपयोग लूप के लिए एक नई शैली में कर सकते हैं, 3 निर्देशांक x, y और z पर लूप के लिए कह सकते हैं (आप संदेह नहीं कर सकते हैं कि अधिक "उपयोगी" उदाहरणों का निर्माण करें) वेक्टर की जगह जैसे स्ट्रिंग):
Vector v = ...;
for (double x : v) { ... }
हम भी कर सकते हैं:
Vector v = ...;
for (double x : v.normalize().negate()) { ... }
और भी:
for (double x : Vector{1., 2., 3.}) { ... }
हालांकि, निम्नलिखित (यह मुझे लगता है) टूट गया है:
for (double x : Vector{1., 2., 3.}.normalize()) { ... }
हालांकि यह पिछले दो उपयोगों के तार्किक संयोजन की तरह लगता है, मुझे लगता है कि यह अंतिम उपयोग एक झूलने वाला संदर्भ बनाता है जबकि पिछले दो पूरी तरह से ठीक हैं।
- क्या यह सही और व्यापक रूप से सराहा गया है?
- उपरोक्त में से कौन सा भाग "बुरा" हिस्सा है, जिसे टाला जाना चाहिए?
- क्या लूप के लिए श्रेणी-आधारित की परिभाषा को बदलकर भाषा में सुधार किया जाएगा, ताकि लूप की अवधि के लिए फॉर-एक्सप्रेशन में निर्मित अस्थायी मौजूद हों?