2014-11-26 13 views
9

Sto provando a creare un ciclo infinito, in cui un blocco di codice verrà eseguito per sempre.Creazione di un ciclo infinito

Tutta la documentazione del ciclo ho trovato avvertimenti contro la creazione di un ciclo infinito, ma nessun esempio di uno funzionante.

Se ho un blocco di codice:

{ puts "foo" 
    puts "bar" 
    sleep 300 } 

Come posso fare per l'esecuzione di questo blocco per sempre?

+5

Hai codificato questo 'ruby-on-rails'. Se stai cercando di creare un loop infinito in Rails, probabilmente stai facendo qualcosa di terribilmente sbagliato. Non puoi farlo nello stesso processo che sta servendo il tuo sito, o il singolo thread di esecuzione non può effettivamente rispondere alle richieste in arrivo. Se si desidera eseguire un'operazione ogni 300 secondi, è necessario un processo in background asincrono. Dovresti descrivere il tuo problema reale in modo che possiamo fornirti un vero consiglio: usare un ciclo infinito è una * soluzione *, non un * problema *. – meagar

+0

Grazie per il chiarimento. Questo loop non viene utilizzato per le guide. Ho rimosso il tag. Grazie per la spiegazione! –

risposta

15
loop do 
    puts 'foo' 
    puts 'bar' 
    sleep 300 
end 
+0

Suvviato per una risposta corretta, ma la risposta migliore è probabilmente ancora i commenti di @ meagar in questione. :) – Amadan

-2

1) While:

While 1==1 # As the condition 1 is equal to 1 is true, it always runs. 
    puts "foo" 
    puts "bar" 
    sleep 300 
    end 

2) ricorsione:

def infiniteLoop # Using recursion concept 
     puts "foo" 
     puts "bar" 
     sleep 300 
     infiniteLoop #Calling this method again  
    end 

EDIT: Ho pensato che questo avrebbe funzionato, ma come detto Gabriel, che otterrebbe SystemStackError.

3) Loop

loop do 
    puts "foo" 
    .... 
    end 

4) Usando meno

unless 1 == 2 # Unless 1 is equal to 2 , it keeps running 
puts "foo" 
... 
end 
+3

'unless' non è un costrutto di loop, è un sinonimo di' if not'. Potresti aver pensato a 'until', sinonimo di' while not'.E mentre siamo in 'while', Ruby fa distinzione tra maiuscole e minuscole:' While' è una costante indefinita, e non una parola chiave come 'while' is; e come parola chiave, non accetta un blocco, quindi 'while ... do' è anche un errore di sintassi. – Amadan

+1

L'alternativa di ricorsione non funzionerà come con ogni iterazione si sta aggiungendo un livello allo stack ed eventualmente un ['SystemStackError'] (http://www.ruby-doc.org/core-2.1.5/SystemStackError.html) sarà sollevato. –

+0

Grazie ragazzi, sulle correzioni. –

9

Ecco alcuni esempi di cicli infiniti mediante blocchi.

Loop

loop do 
    puts "foo" 
    puts "bar" 
    sleep 300 
end 

Mentre

while true 
    puts "foo" 
    puts "bar" 
    sleep 300 
end 

Fino

until false 
    puts "foo" 
    puts "bar" 
    sleep 300 
end 

Lambda

-> { puts "foo" ; puts "bar" ; sleep 300}.call until false 

Ci sono anche alcune variazioni del lambda, usando la sintassi lambda non-stabby. Inoltre potremmo usare un Proc.

BEGIN..END

begin 
    puts "foo" 
    puts "bar" 
    sleep 300 
end while false 
Problemi correlati