2010-03-23 9 views

उत्तर

43

रुबी का yield कीवर्ड उसी नाम से पाइथन कीवर्ड से बहुत अलग है, इसलिए इसके द्वारा भ्रमित न हों। रूबी का yield कीवर्ड एक विधि से जुड़े ब्लॉक को कॉल करने के लिए वाक्य रचनात्मक चीनी है।

निकटतम समकक्ष रूबी की गणनाकर्ता वर्ग है। उदाहरण के लिए, पायथन के बराबर:

def eternal_sequence(): 
    i = 0 
    while True: 
    yield i 
    i += 1 

यह है:

def eternal_sequence 
    Enumerator.new do |enum| 
    i = 0 
    while true 
     enum.yield i # <- Notice that this is the yield method of the enumerator, not the yield keyword 
     i +=1 
    end 
    end 
end 

तुम भी enum_for साथ गणना के तरीकों मौजूदा के लिए ूगणकों बना सकते हैं। उदाहरण के लिए, ('a'..'z').enum_for(:each_with_index) आपको वर्णमाला में उनके स्थान के साथ लोअरकेस अक्षरों का एक गणक देता है। आप इसे each_with_index जैसे मानक संख्यात्मक विधियों के साथ मुफ्त में प्राप्त करते हैं, ताकि आप अंक प्राप्त करने के लिए केवल ('a'..'z').each_with_index लिख सकें।

+2

'0.step', 1.9 – steenslag

21

मैं Fibers कि तरह से इस्तेमाल किया देखा है, this article से एक उदाहरण देखें:

fib = Fiber.new do 
    x, y = 0, 1 
    loop do 
    Fiber.yield y 
    x,y = y,x+y 
    end 
end 
20.times { puts fib.resume } 
+6

वास्तव में के बाद से एक शाश्वत प्रगणक है में रूबी 1.9 के' Enumerator' Fiber' का उपयोग कर 'कार्यान्वित किया जाता है। वास्तव में, क्योंकि उन्हें जोड़ने के मुख्य कारणों में से एक था, वास्तव में, क्योंकि रूबी 1.8 'अंकुशू का उपयोग निरंतरता है, लेकिन यह एक है) बल्कि अनावश्यक है और बी) उस समय निरंतर रूबी भाषा से हटाया जा रहा था। –

10

आप lazily, मूल्यों उत्पन्न करने के लिए @ चक के जवाब सही एक है देख रहे हैं।

यदि आप एक संग्रह पर आलसी ढंग से पुन: प्रयास करना चाहते हैं, तो रूबी 2.0 ने नया .lazy गणक प्रस्तुत किया।

range = 1..Float::INFINITY 
puts range.map { |x| x+1 }.first(10) # infinite loop 
puts range.lazy.map { |x| x+1 }.first(10) # [2, 3, 4, 5, 6, 7, 8, 9, 10, 11] 
संबंधित मुद्दे