2010-11-23 10 views
30

मैं सात दिनों में सात भाषाएं पुस्तक में आईओ दिवस 2 पर दूसरा अभ्यास पूरा करने की कोशिश कर रहा हूं। इसमें आपके पूछा, "आप कैसे बदल जाएगा/0 वापस जाने के लिए अगर भाजक शून्य है?" मैं निर्धारित किया है मैं का उपयोग कर संख्या के लिए एक विधि जोड़ सकते हैं कि:आप मौजूदा ऑपरेटरों को आईओ में इनका उपयोग किए बिना कैसे बदलते हैं?

Number new_div := method(i, if(i != 0, self/i, 0)) 

क्या मैं सुनिश्चित नहीं हूं है कैसे ऑपरेटर तालिका में "/" को प्रतिस्थापित करने के लिए। मैंने कोशिश की है:

Number/:= Number new_div 
Number/:= self new_div 

लेकिन मुझे दोनों के लिए अपवाद मिलता है क्योंकि यह "/" को आमंत्रित करने का प्रयास कर रहा है। मैं संख्या पर एक संभाल कैसे प्राप्त करूं/इसलिए मैं पुरानी विधि का संदर्भ संग्रहीत कर सकता हूं और फिर अपने उद्देश्यों के लिए इसे फिर से परिभाषित कर सकता हूं? क्या मैं इस सब गलत के बारे में जा रहा हूँ?

+0

मैं एक ही समस्या को हल करने की कोशिश कर रहा हूं। मैं करता हूं "संख्या /: = विधि (...)"। और मैं उसी अनंत लूप से फंस गया हूं जो जेर ने बताया। मुझे मूल कार्यान्वयन/इसे कॉल करने के लिए कोई रास्ता नहीं मिल रहा है। –

+0

@ एरिक होग: मैंने अपना जवाब पोस्ट नहीं किया क्योंकि * जेर * बस मुझे इसे हराया! मैंने इसे अभी पोस्ट कर दिया है क्योंकि यह दिखाता है कि मूल विभाजन को कैसे संरक्षित किया जाए और रिकर्सन लूप से बचें। – draegtun

उत्तर

39

एरिक Hogue के लिए (टिप्पणियों सवाल देखें):

origDiv := Number getSlot("/") 

10 origDiv(5) println # => 2 
10 origDiv(0) println # => inf 

Number/:= method (i, 
    if (i != 0, self origDiv(i), 0) 
) 

(10/5) println  # => 2 
(10/0) println  # => 0 
+0

धन्यवाद। यह बहुत कुछ है जो मैं कर रहा था सिवाय इसके कि मैं स्वयं उत्पत्ति करने की कोशिश कर रहा था। कोष्ठक के बिना। –

+2

मैं ऑपरेटर तालिका को शामिल करने के समाधान की अपेक्षा करता। इस उत्तर के लिए धन्यवाद। – dpurrington

4

आप क्या करना चाहते क्या चलाया जाता है:

Number setSlot("/", Number getSlot("new_div") 

उदाहरण के लिए।

हालांकि, यह ध्यान दिया जाना चाहिए, आप अपने हाथों पर एक अनंत लूप यदि आप, new_div की कि परिभाषा का उपयोग आप इसे भीतर / विधि कॉल कर रहे हैं, और / ऑपरेटर की स्थापना के बाद से उपयोग करने के लिए new_div कारण होगा होगा जब तक आप स्मृति से बाहर नहीं हो जाते, तब तक 6/2 पर कॉल करने के लिए कॉल करें।

+1

यह कैसे मदद करता है? आपके पास अभी भी एक अनंत लूप होगा। – TrueWill

+0

क्या आपने जो लिखा वह भी पढ़ा? मैं स्पष्ट रूप से अनंत लूप की संभावना के बारे में एक नोट बना देता हूं। – jer

+1

यहां कोई "संभावित" नहीं है। ** ** में ** एक अनंत लूप होगा जब तक कि आप जोहान के मार्ग पर जाएं और विभाजन को फिर से कार्यान्वित करें या @ draegtun के मार्ग पर जाएं और मूल कार्यान्वयन को सहेजें। और आप एक बंद संश्लेषण खो रहे हैं। अन्य उत्तर पूर्ण कार्यान्वयन प्रदान करते हैं, जो आपका उत्तर नहीं देता है। – TrueWill

4

क्या अगर आप अपने परिभाषा के अंदर बिजली ऑपरेटर इस्तेमाल किया है, तो आप की जरूरत नहीं है पुराने विभाजन ऑपरेटर के लिए एक संदर्भ रखने के लिए।

Number/:= method(i, if(i==0, 0, self*i**(-1))) 
+2

यह मानता है कि पुराना व्यवहार डिफ़ॉल्ट व्यवहार है। किसी और ने इसे आप पर बदल दिया होगा। एक अच्छा नागरिक बनें, जब आप इसे बदलना चाहते हैं तो हमेशा मौजूदा व्यवहार को देखें। :) – jer

संबंधित मुद्दे