Sono nuovo di Ruby, c'è un modo per i valori di yield
dalle funzioni di Ruby? Se sì, come? In caso contrario, quali sono le mie opzioni per scrivere codice pigro?C'è qualcosa come i generatori Python in Ruby?
risposta
Ruby's yield
parola chiave è qualcosa di molto diverso dalla parola chiave Python con lo stesso nome, quindi non essere confuso da esso. La parola chiave yield
di Ruby è zucchero sintattico per chiamare un blocco associato a un metodo.
L'equivalente più vicino è la classe Enumeratore di Ruby. Ad esempio, l'equivalente del Python:
def eternal_sequence():
i = 0
while True:
yield i
i += 1
è questo:
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
È inoltre possibile creare enumeratori per i metodi di enumerazione esistente con enum_for
. Ad esempio, ('a'..'z').enum_for(:each_with_index)
fornisce un enumeratore delle lettere minuscole insieme al loro posto nell'alfabeto. Puoi ottenerlo gratuitamente con i metodi Enumerable standard come each_with_index
in 1.9, quindi puoi semplicemente scrivere ('a'..'z').each_with_index
per ottenere l'enumeratore.
ho visto Fibers utilizzato in quel modo, guardare un esempio dalla 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 }
Infatti, in Ruby 1.9 del' Enumerator' è implementato utilizzando 'Fiber'. Questo è stato uno dei motivi principali per aggiungerli, in realtà, perché in Ruby 1.8 'gli Enumerator usano le continuazioni, ma questo è un) piuttosto ingombrante eb) in quel momento le versioni successive sarebbero state rimosse dal linguaggio Ruby. –
Se siete alla ricerca di generare pigramente valori, @ risposta di Chuck è quella corretta.
Se si sta cercando di scorrere lentamente su una raccolta, Ruby 2.0 ha introdotto il nuovo enumeratore .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]
- 1. Generatori di Ruby vs generatori Python
- 2. Qualcosa come SciPy in Ruby?
- 3. Generatori ricorsivi in Python
- 4. Confrontando due generatori in Python
- 5. generatore python di generatori?
- 6. Generatori e loop in Python
- 7. Generatori di profili Python
- 8. In che modo i generatori Python sanno chi sta chiamando?
- 9. Come unire due generatori in Python?
- 10. Scala equivalente ai generatori Python?
- 11. Programmazione strutturata e generatori Python?
- 12. Come richiamare i generatori dal codice?
- 13. Ruby ha qualcosa come la comprensione delle liste di Python?
- 14. Che tipo di firma hanno i generatori in Python?
- 15. I generatori possono essere usati con string.format in python?
- 16. Come utilizzare i generatori PHP senza foreach?
- 17. I generatori sono thread-safe?
- 18. Come ripetere qualcosa su eccezione in python?
- 19. In Rails, dovrei usare i generatori?
- 20. Qualcosa come python timedelta in golang
- 21. Il debugger Python viene eseguito nei generatori?
- 22. Python 3: metodo di invio dei generatori
- 23. C'è qualcosa come in i in range (length) in PHP?
- 24. I metodi senza classe in Python sono utili a qualcosa?
- 25. C'è qualcosa come uno stream null in Ruby?
- 26. Come eseguire un'attività asincrona contro i generatori es6 in loop
- 27. Consigli sui generatori di parser Python
- 28. Perché i generatori non possono essere messi in salamoia?
- 29. Python: Mi manca qualcosa?
- 30. L'enumerazione di Python in Ruby?
'0.step' è un enumeratore eterna dal 1.9 – steenslag