2011-09-25 13 views
7
import std.stdio; 

class IntegerContainer 
{ 
    public int Integer = 1; 
} 

void DoubleInteger(IntegerContainer Container) 
{ 
    Container.Integer *= 2; 
} 

void main() 
{ 
    IntegerContainer Container = new IntegerContainer; // Internal integer defaults to one. 
    DoubleInteger(Container); // Internal integer changes to two inside the function. 
    writefln(Container.Integer); // Prints "2." 
} 

डी में, संदर्भ बनाम मान फ़ंक्शन पैरामीटर की बजाय प्रकार का एक गुण है। सी ++ से आ रहा है, यह मेरे लिए वास्तव में बुरा लगता है।मैं ऑब्जेक्ट को मूल्य से कैसे पास करूं?

ऐसा लगता है कि ref कीवर्ड struct एस स्वीकार करने वाले कार्यों के लिए पास-बाय-रेफरेंस को मजबूर करने के लिए है। क्या मूल्य के अनुसार class ई पास करने के लिए ऐसा समकक्ष है?

उदाहरण के लिए, मान लें कि मैं एक फ़ंक्शन फ़ंक्शन बनाना चाहता हूं जो एक कस्टम कंटेनर क्लास की क्रमबद्ध प्रतिलिपि देता है। सी ++ में, यह का उपयोग करने जितना आसान है, Foo Sort(Foo& Object) के विपरीत। मैं वस्तु को मैन्युअल रूप से कॉपी किए बिना डी में ऐसा करने का कोई तरीका नहीं देखता हूं।

+1

कक्षाओं की वस्तुओं के साथ भी, यह अभी भी पास-दर-मूल्य है, क्योंकि यह संदर्भ है कि आप गुजर रहे हैं, मूल्य – newacct

+3

@ न्यूवेक्ट मुझे लगता है कि हर कोई जानता है कि "पास-बाय-वैल्यू" का क्या अर्थ है। – Maxpm

उत्तर

11

कक्षाएं डिज़ाइन द्वारा संदर्भ प्रकार हैं। वे मूल्य से पारित नहीं होना चाहिए। यह जावा और सी # के साथ बिल्कुल वही है। हालांकि, जावा और सी # के विपरीत, डी में पूर्ण उपयोगकर्ता द्वारा परिभाषित मूल्य प्रकार भी हैं, क्योंकि इसमें structs हैं (सी # में structs भी हैं, लेकिन वे अधिक अधिक सीमित हैं)। तथ्य यह है कि सी ++ दो कारणों की समस्याओं को हल करता है जैसे कि object slicing

अब, बार हैं जब आप किसी संदर्भ प्रकार की प्रतिलिपि बनाना चाहते हैं। इसका समाधान cloning है। आप अपनी कक्षा को clone फ़ंक्शन देते हैं जो उस ऑब्जेक्ट की प्रतिलिपि देता है जिसे इसे कॉल किया जाता है। इस तरह, जब आप की आवश्यकता होती है तो आप इसकी प्रतिलिपि बना सकते हैं, और जब आपको इसकी आवश्यकता होती है तो इसे केवल कॉपी किया जाता है। जावा और सी # में एक मानक clone फ़ंक्शन है जो अधिकांश प्रकार कार्यान्वित करता है, लेकिन किसी भी कारण से डी नहीं करता है। मुझे यकीन नहीं है क्यों। लेकिन यह अभी भी अपने आप के लिए इस तरह के एक समारोह घोषित करने के लिए काफी आसान है। यह सिर्फ Object पर नहीं होगा, जो आपको जावा और सी # में वास्तविक प्रकार की तरह की देखभाल करने के बिना किसी भी क्लास ऑब्जेक्ट पर इसका उपयोग करने की अनुमति देगा। यदि आप चाहें तो आप हमेशा एक कॉपी कन्स्ट्रक्टर बना सकते हैं, लेकिन यह कम लचीला है, क्योंकि आपको कॉपी करने वाले ऑब्जेक्ट के प्रकार को जानना है, जबकि clone के साथ, यह clone रिटर्न के प्रकार से प्राप्त किया जा सकता है (जो होगा जावा और सी # के मामले में Object हो, लेकिन जो भी आप डी में तय करेंगे, वह कार्य गैर-मानक है)।

+1

आईआईआरसी डी (सरणी) में कुछ चीजें एक 'डुप्ली' संपत्ति है। – BCS

+0

हां, लेकिन कक्षाएं आमतौर पर इस तरह के एक समारोह को लागू नहीं करती हैं। हालांकि यह हो सकता है कि यह 'क्लोन' की बजाय 'dup' नामक फ़ंक्शन को लागू करने के लिए सामान्य हो जाएगा (हालांकि मानक लाइब्रेरी में अभी तक कई कक्षाएं नहीं हैं, इसलिए मुझे नहीं लगता कि एक विशेष क्लोन फ़ंक्शन चालू है अभी तक सभी मानक)। भले ही, यह वही अवधारणा है। –

+0

आह। हाँ। मुझे और स्पष्ट होना चाहिए: क्योंकि अन्य चीजें 'डुप्ली' का उपयोग करती हैं, यह एक अच्छा विचार हो सकता है कि फ़ंक्शन 'क्लोन' को कॉल न करें। नाम रखने से टेम्पलेट कोड क्लीनर हो सकता है। – BCS

4

हाँ, बस कक्षा के बजाय एक संरचना का उपयोग करें।

लेकिन यदि आप ऑब्जेक्ट कॉपी करना चाहते हैं, तो आपको स्वयं क्लोनिंग करना होगा। ध्यान दें कि डी डिजाइनरों ने इसे नहीं बनाया; यह सी # में बिल्कुल वही तरीका है, और जावा में काफी समान है। लक्ष्य वस्तुओं को अत्यधिक कॉपी करने से रोकने के लिए है, जिसे सी ++ के नकारात्मक हिस्से के रूप में देखा जाता है (क्योंकि यह कोड में बहुत छिपी हुई है)।

+0

संपादित देखें। [15char] – Maxpm

+1

@ मैक्सपैम: मेरे दूसरे पैराग्राफ की पहली वाक्य देखें। – Mehrdad

3
यहां तक ​​कि सी में

++ इस:

Foo Sorted(Foo Object) 

कि उपयोगी नहीं है। क्या होगा यदि ऑब्जेक्ट पहले ही सॉर्ट हो चुका है और आपको एक प्रतिलिपि बनाने की आवश्यकता नहीं है?

डी में आपको अपनी कक्षा के लिए कुछ clone() प्रदान करने की आवश्यकता होगी और आवश्यकता होने पर इसे कॉल करें।

अन्यथा मेहदाद के रूप में सूत्रों का उपयोग करें।

संपादित करें: यह स्पष्ट नहीं है कि "ऑब्जेक्ट की प्रतिलिपि बनाना" वास्तव में क्या करना चाहिए। यदि इसमें वस्तुओं की सरणी है तो क्या यह सरणी क्लोन करेगा? और ऑब्जेक्ट संदर्भों के बारे में क्या है? यह वास्तव में अच्छा है कि महासागर वाल्टर ब्राइट, डी के लेखक, डिफ़ॉल्ट रूप से कक्षा के उदाहरणों की प्रतिलिपि प्रदान नहीं करते थे।