2012-06-11 9 views
6

Aprire irb edi Windows 'scelta' rovinare Ruby 'ottiene' metodo

  1. tipo gets. Dovrebbe funzionare bene.
  2. Quindi provare system("choice /c YN") Dovrebbe funzionare come previsto.
  3. Ora prova di nuovo gets, si comporta in modo strano.

Qualcuno può dirmi perché è?

MODIFICA: per alcuni chiarimenti sul comportamento "dispari", mi consente di digitare per gets, ma non mi mostra i caratteri e devo premere due volte il tasto Invio.

+0

Dovresti essere più chiaro sulla natura del comportamento strano. L'ho provato e ho notato che non accettava i dati a meno che non avessi premuto il tasto Invio due volte, dopo aver eseguito il comando 'system (" choice/c YN ")'. Una lettera in più a volte si infilava di nascosto anche lì. E 'quello che succede sulla tua parte? – KChaloux

+0

@KChaloux È esattamente quello che succede, sì. Modificherò il mio post per includere tali dettagli. – itdoesntwork

+8

Questo è strano, Windows non rovina mai nulla. –

risposta

1

La gestione del terminale di ingresso-uscita è arte oscura e misteriosa. Chiunque stia cercando di produrre l'output colorized di bash in windows PowerShell tramite ssh lo sa. (E le varie abitudini di scorciatoia come Ctrl + Backspace peggiorano le cose)

Uno dei possibili motivi del tuo problema è la gestione dei caratteri speciali. Ogni terminale là fuori può digitare caratteri in numero di modi diversi e analizza il proprio output in cerca di determinate sequenze di caratteri per passare da uno stato all'altro.

F.e. here si possono trovare sequenze ANSI di codice di escape, uno dei possibili standard supportati tra diversi tipi di terminali.

Vedere lì Esc[5;45m? Ciò farà lampeggiare tutto il seguente output su sfondo magenta. E ci sono molte altre cose come quelle là fuori.

Quindi, la risposta alla tua domanda è letteralmente: il tuo comando choice disturba qualcosa con le modalità di output usando speciali sequenze di escape, e ruby ​​ottiene delle interruzioni in quella strana modalità speciale di operazione del terminale.

Ma più utile sarà il collegamento a HighLine gem documentation. Perché si potrebbe voler implementare comportamenti specifici della piattaforma e invadenti quando è possibile implementare lo stesso con about 12 LOC? Tutto il rispetto per il Gist va a botimer, mi sono imbattuto nel suo codice solo usando la ricerca.