मैं Array#product
का उपयोग करने का सुझाव देता हूं।
[:a, :b].product [4,5]
जो आपके इच्छित आउटपुट को उत्पन्न करेगा।
irb(main):001:0> [:a, :b].product [4,5]
=> [[:a, 4], [:a, 5], [:b, 4], [:b, 5]]
irb(main):002:0>
यदि आप क्रमपरिवर्तन के आलसी जनरेटर चाहते हैं, तो मैंने पहले ऐसा कुछ लिखा है। लेकिन मैं आपको चेतावनी देता हूं, अगर आपके पास गणना करने के लिए बड़ी संख्या में क्रमपरिवर्तन हैं तो इसमें कुछ समय लग सकता है। आपको this file की पहली 40 - 45 लाइनों से जो चाहिए उसे लेने में सक्षम होना चाहिए (यह फ़ाइल वैसे भी एक प्रयोग थी)।
यह चाल रूबी 1.9.2 का उपयोग करके एनीमेशन की एक सरणी के माध्यम से अपना रास्ता बनाने के लिए गणना करने के लिए है। तो आप पहले एक गणनाकर्ता बनाते हैं जो अंतहीन रूप से किसी सरणी के माध्यम से चक्र चलाएगा, और आपके सरणी-ऑफ-एरे एन्यूमरेटर में आप पहले आउटपुट सेट को ट्रैक करेंगे और दूसरी बार हिट होने पर लूप को समाप्त करेंगे। यह एकमात्र तरीका था जिसे मैं समझ सकता हूं कि इस तरह के लूप को कैसे समाप्त किया जाए।
def infinite_iterator(array)
Enumerator.new do |result|
loop do
array.cycle { |item| result << item }
end
end
end
def cartesian_iterator(data)
Enumerator.new do |result|
first = data.map { |p| p.next }
result << first
i = 1
parts = first.dup
loop do
parts[2-i] = data[2-i].next
break if parts == first
result << parts.join
i = ((i + 1) % parts.size)
end
end
end
array = [ infinite_iterator([:a,:b]), infinite_iterator([4,5]) ]
generator = cartesian_iterator(array)
generator.each { |a| p a }
स्रोत
2012-07-05 20:36:47
क्या आप कृपया बता सकते हैं कि आप क्या पूछ रहे हैं? आपको कैसे बनाना चाहिए? क्या आप 'कार्टेशियन प्रोडक्ट' नामक एक कक्षा बनाने की कोशिश कर रहे हैं जो दिखाएगा क्या करेगा? – denniss
हां, इसके लिए एक क्लास विधि की आवश्यकता है। मुझे पता है कि एक मूल्य वापस करने के लिए एक उदाहरण विधि कैसे बनाएं, लेकिन मुझे नहीं पता कि क्लास ऑब्जेक्ट के मान को संशोधित करने के लिए क्लास विधि कैसे बनाएं। – ZhijieWang
क्या यह होमवर्क है? यदि ऐसा है, तो यह ठीक है, लोग आपको सही दिशा में घुमाने की कोशिश करेंगे। उत्पाद की लंबाई – steenslag