Thursday, 15 August 2013

class - mutable method X.this is not callable using a immutable object error in D -


मुझे इस पेज से कॉपी किया गया डी कोड है:

  import std.stdio; Struct एस {यह (int x) {this.x = x; } Int x; } वर्ग फू {एस ओ; चार [] एस; Int i; // ... यह (एस ओ, const char [] s, int i) {this.o = o; This.s = s.dup; This.i = i; } फू डुप () कॉन्स्ट {रिटर्न न्यू फु (ओ, एस, आई); } अपरिवर्तनीय (फू) आईडीप () const (नया) अपरिवर्तनीय (फू) (यह.ओ, यह एस, this.i); }} शून्य मुख्य () {ऑटो var1 = नया फू (एस (5), "हैलो", 42); ऑटो var2 = var1.dup (); अपरिवर्तनीय (फू) imm = var1.idup (); writeln (var1); writeln (var2); writeln (IMM); }  

समस्या यह है कि मेरे पास "अस्थिर विधि a.Foo। यह एक अपरिवर्तनीय वस्तु का उपयोग करने योग्य नहीं है" त्रुटि जब संकलन करता है।

आप यह त्रुटि प्राप्त कर रहे हैं क्योंकि आपने नया अपरिवर्तनीय (फ़ू) (this.o , This.s, this.i); यह एक अपरिवर्तनीय कन्स्ट्रक्टर के लिए दिखता है, और आपके पास परिभाषित एक अचूक वस्तु के लिए केवल एक कन्स्ट्रक्टर है, जो कि डिफ़ॉल्ट है आप इसे कन्स्ट्रक्टर लिखकर और अपरिवर्तनीय को चिह्नित करके इसे हल कर सकते हैं, आपको यह चाहिए कि आप const के तरीकों को कैसे चिह्नित करते हैं, लेकिन बेहतर और अक्सर आसान समाधान है।

< P> यदि आप कर सकते हैं, तो अपने कन्स्ट्रक्टर और विधियों को शुद्ध के रूप में चिह्नित करने का प्रयास करें यदि आप कन्स्ट्रक्टर को शुद्ध के रूप में चिह्नित करते हैं, तो कन्स्ट्रक्टर का इस्तेमाल दोनों अस्थिर और अपरिवर्तनीय वस्तुओं के लिए किया जा सकता है वैकल्पिक रूप से, आप अपना idup विधि को शुद्ध के रूप में चिह्नित कर सकते हैं, एक नया फ़ू बनाएं, जो एक अयोग्य वस्तु है, और इसे अपरिवर्तनीय । यह सब इसलिए है क्योंकि शुद्ध फ़ंक्शंस सुरक्षित रूप से अपरिवर्तनीय डेटा बना सकते हैं यदि डेटा वापस अन्यत्र संदर्भित नहीं है। दूसरे शब्दों में, विशिष्ट स्वामित्व वाली स्मृति को अपरिवर्तनीय प्रकारों में ले जाया जा सकता है।


No comments:

Post a Comment