आप doesNotUnderstand:
के लिए देख रहे हैं। यदि reduce
एक ऐसी वस्तु है जो +
लागू नहीं करती है लेकिन आप इसे किसी भी तरह भेजते हैं, तो इसके बजाय इसकी doesNotUnderstand:
विधि लागू की जाएगी। आम तौर पर यह सिर्फ एक त्रुटि उठाता है। लेकिन आप डिफ़ॉल्ट को ओवरराइड कर सकते हैं, और चयनकर्ता +
और अन्य तर्क तक पहुंच सकते हैं और जो भी आप उन्हें पसंद करते हैं।
सादगी के लिए, कक्षा Reduce
बनाएं। अपने वर्ग की तरफ, विधि को परिभाषित:
doesNotUnderstand: aMessage
^aMessage argument reduce: aMessage selector
तो फिर तुम इसे इस तरह उपयोग कर सकते हैं:
Reduce + (#(1 2 3) * #(4 5 6))
जो एक स्क्वीक कार्यक्षेत्र में 32 उत्तर, अपेक्षा के अनुरूप।
यह काम करता है क्योंकि *
पहले से ही उपयुक्त अर्थशास्त्र के साथ संग्रह के लिए लागू किया गया है।
doesNotUnderstand: aMessage
^aMessage argument collect: [:e | e reduce: aMessage selector]
और भी SequenceableCollection
को यह पद्धति जोड़ें::
वैकल्पिक रूप से, इस वर्ग के साइड विधि के साथ एक वर्ग ApplyToAll
जोड़ने
transposed
^self first withIndexCollect: [:c :i | self collect: [:r | r at: i]]
तो फिर तुम लिख सकते हैं
Reduce + (ApplyToAll * #((1 2 3) #(4 5 6)) transposed)
जो आपके मूल विचार के बहुत करीब है।
स्रोत
2010-11-18 14:07:14
लेकिन जब आप इसे करना चाहते हैं, और कर सकते हैं, शायद आपको नहीं करना चाहिए। कम से कम इस समस्या को हल करने के लिए नहीं। –