2011-02-10 18 views

risposta

50

È possibile utilizzare la sequenza di escape \r alla fine della riga (la riga successiva sovrascriverà questa riga). Seguendo il tuo esempio:

require 'time' 

loop do 
    time = Time.now.to_s + "\r" 
    print time 
    $stdout.flush 
    sleep 1 
end 
+1

Hmm, mi piace la soluzione di @jsegal meglio, quindi scegli la sua risposta. Ricordati di "flush" il tuo output ancora. – cam

+1

Sono diviso qui, perché la tua risposta è uno snippet di codice perfettamente funzionante di quello che ho chiesto esattamente: una soluzione in * Ruby *. Sì, potrebbe essere più elegante se usato il suggerimento di jsegal. Ma a) la risposta di jsegal non è specifica del ruby ​​eb) Preferirei piuttosto una risposta con uno snippet di lavoro. Quindi ho intenzione di andare avanti e modificare la tua risposta per riflettere il suggerimento di jsegal, e quando/se quella modifica è accettata, accetterò la tua risposta e ricompenserò jsegal votandolo. È il meglio che posso fare con questo sistema. –

+0

@Steph: il tuo dilemma su quale risposta accettare sembra principalmente basato sul fatto che la risposta di jsegal non includeva uno snippet di codice. Considerare Stack Overflow non è un sito di condivisione del codice, che sembra un requisito abbastanza arbitrario. Dovresti revocare le due risposte se le hai trovate utili e accettare quella che ti ha aiutato * di più * a trovare la soluzione che ha funzionato per te. –

23

utilizzare la sequenza di escape \r alla fine della linea - si tratta di un ritorno del carrello senza un avanzamento linea di.

Sulla maggior parte dei terminali unix ciò farà ciò che si desidera: la riga successiva sovrascriverà la riga precedente.

Si consiglia di riempire la fine delle linee con spazi se sono più corte delle righe precedenti.

Si noti che questo non è specifico di Ruby. Questo trucco funziona in qualsiasi lingua!

+0

Si noti che se l'uscita del testo è più ampia della finestra del terminale corrente, si inizierà a vedere di nuovo riga dopo riga. –

+3

Per evitare problemi con la linea corrente che è più corta della precedente. Riempilo con il metodo rjust/ljust ad es. "il mio output" .ljust (80). – sunsations

1

Ecco un esempio che ho appena scritto che accetta una matrice e restituisce spazi bianchi se necessario. È possibile decommentare la variabile di velocità per controllare la velocità in fase di esecuzione. Rimuove anche l'altro sleep 0.2 L'ultima parte dell'array deve essere vuota per produrre l'intero array, continuando a lavorare per risolverlo.

#@speed = ARGV[0] 

strArray = [ "First String there are also things here to backspace", "Second Stringhereare other things too ahdafadsf", "Third String", "Forth String", "Fifth String", "Sixth String", " " ] 


#array = [ "/", "-", "|", "|", "-", "\\", " "] 

def makeNewLine(array) 
    diff = nil 
    print array[0], "\r" 
    for i in (1..array.count - 1) 
     #sleep @speed.to_f 
     sleep 0.2 
     if array[i].length < array[i - 1].length 
      diff = array[i - 1].length - array[i].length 
     end 
     print array[i] 
     diff.times { print " " } if !diff.nil? 
     print "\r" 
     $stdout.flush 

    end 
end 

20.times { makeNewLine(strArray) } 

#20.times { makeNewLine(array)} 
Problemi correlati