2012-06-11 15 views
6

Abre irb ycomando 'elección' de Windows estropear Rubí 'consigue' método

  1. tipo gets. Debería funcionar bien.
  2. Luego intente system("choice /c YN") Debería funcionar como se esperaba.
  3. Ahora intente gets nuevamente, se comporta de manera extraña.

¿Puede alguien decirme por qué es esto?

EDITAR: Para alguna aclaración sobre el comportamiento "impar", me permite escribir para gets, pero no me muestra los caracteres y tengo que presionar la tecla enter dos veces.

+0

Debe tener más en claro la naturaleza del comportamiento extraño. Lo probé y noté que no aceptaba datos a menos que presionara la tecla enter dos veces, después de ejecutar el comando 'system (" choice/c YN ")'. Una carta extra a veces se colaría allí también. ¿Es eso lo que sucede en tu extremo? – KChaloux

+0

@KChaloux Eso es exactamente lo que sucede, sí. Editaré mi publicación para incluir esos detalles. – itdoesntwork

+8

Eso es raro, Windows casi nunca arruina nada. –

Respuesta

1

El manejo de la entrada-salida del terminal es arte oscuro y misterioso. Cualquiera que intente hacer que la salida coloreada de bash funcione en Windows PowerShell a través de ssh lo sabe. (Y varios hábitos de acceso directo como Ctrl + Retroceso solo empeoran las cosas.)

Uno de los posibles motivos de su problema es el manejo de caracteres especiales. Cada terminal puede escribir caracteres en número de modos diferentes, y analiza su propia salida en busca de ciertas secuencias de caracteres para alternar estados.

F.e. here se pueden encontrar secuencias de código de escape ANSI, una de las posibles normas admitidas entre diferentes tipos de terminales.

Ver allí Esc[5;45m? Eso hará que parpadee toda la siguiente salida en el fondo magenta. Y hay muchas más cosas así por ahí.

Entonces, la respuesta a su pregunta tomada literalmente es - su comando choice confunde algo con los modos de salida usando secuencias de escape especiales, y ruby ​​obtiene descansos en ese peculiar modo especial de operación de la terminal.

Pero más útil será el enlace a HighLine gem documentation. ¿Por qué uno querría implementar un comportamiento intrusivo y específico de la plataforma cuando es posible implementarlo con about 12 LOC? Todo el respeto por el Gist va al botimer, solo he tropezado con su código usando la búsqueda.

Cuestiones relacionadas