2009-08-13 12 views
42

Estoy en una situación en la que necesito el valor ASCII de un carácter (para Project Euler question #22, si desea obtener información específica) y estoy ejecutando en un problema.Obtener un código de carácter ASCII en Ruby con `?` (Signo de interrogación) falla

Siendo nuevo en ruby, lo busqué en Google, y encontré que ? era el camino a seguir: ?A o lo que sea. Pero cuando lo incorporo a mi código, el resultado de esa declaración es la cadena "A" -no código de carácter. Mismo problema con [0] y slice(0), los cuales teóricamente deberían devolver el código ASCII.

Lo único que se me ocurre es que se trata de una versión de rubí. Estoy usando 1.9.1-p0, habiéndome actualizado desde 1.8.6 esta tarde. Me engañé un poco yendo de una versión funcional de Ruby, en el mismo directorio, pensé que probablemente ya tenía los archivos que no vienen incluidos con el archivo .zip, así que no los descargué.

¿Por qué exactamente todos mis códigos ASCII se convierten en caracteres reales?

Respuesta

62

Ruby before 1.9 tratado caracteres algo inconsistentemente. ?a y "a"[0] devolvería un número entero que representa el valor ASCII del personaje (que normalmente no era el comportamiento que las personas estaban buscando), pero en el uso práctico, los caracteres normalmente se representarían con una cadena de un carácter. En Ruby 1.9, los personajes nunca se vuelven misteriosamente enteros. Si desea obtener el valor ASCII de un personaje, puede usar el método ord, como ?a.ord (que devuelve 97).

+0

Solo para completar, la versión 1.9.3 o posterior no necesita '?' Firme antes de la carta, podemos obtener el valor entero solo con: a.ord – yat0

+3

@polska: Creo que puede haber entendido mal. Los ? significa que queremos el carácter 'a', por lo que escribir '? a.ord' da 97, mientras que simplemente escribir' a.ord' busca una variable o método llamado 'a' y arrojará un NameError si no hay nada con ese nombre o un NoMethodError si la variable 'a' no contiene una cadena. – Chuck

+1

Sí, tienes razón ... He entendido mal. Funciona con? A.ord o "a" .ord – yat0

7

Encontré la solución. "string" .ord devuelve el código ascii de s. Parece que los métodos que había encontrado están rotos en la serie 1.9 de ruby.

+1

Es mejor editar su publicación original en lugar de publicar una respuesta separada a su propia pregunta. – pierrotlefou

+7

@pierr - Pero esta es una respuesta a la pregunta, no solo una actualización de la pregunta – rampion

+5

Los métodos no están rotos. Ruby 1.9 define su comportamiento de manera diferente, como explicó Chuck. – Telemachus

10

Para 1,8 y 1,9

?a.class == String ? ?a.ord : ?a 

o

"a".class == String ? "a".ord : "a"[0] 
+1

Este último me falla en 1.8.7: '>>" a ".class == String? "a" .ord: "a" [0] 'produce el error ' NoMethodError: método indefinido \ 'ord 'para" a ": Cadena de (irb): 3' –

32

¿Qué tal

"a"[0].ord 

de 1,8/1,9 portabilidad.

-2

Si vuelve a leer la pregunta 22 del proyecto Euler, verá que no está buscando los valores ASCII de los caracteres. Lo que la pregunta está buscando, por el carácter "A", por ejemplo, es 1, su posición en el alfabeto donde como "A" tiene un valor ASCII de 65.

+1

Seguramente podría obtener el puesto en el alfabeto restando 64 del valor ASCII de la letra mayúscula. Esta respuesta debe ser un comentario. –

+0

@NilsLuxton, Tal vez esto debería haber sido un comentario, pero es una mejor respuesta a la pregunta real que están buscando. Si lee la pregunta de Project Euler a la que se hace referencia, el valor de ACSII no es lo que está buscando. No merecía un voto hacia abajo. – Schechter

+2

La pregunta era "¿Cómo obtengo el valor ASCII de un personaje?" No "¿Alguien puede aclarar el n. ° 22 en el Proyecto Euler". La mención del problema en cuestión es solo contexto. Su solución puede (y probablemente sí) implicar encontrar primero el valor ASCII y calcular a partir de ese momento. Estoy seguro de que OP agradece su aclaración, pero tal como está, no es una respuesta a la pregunta que hicieron. Probablemente estoy siendo un poco estricto con las reglas aquí (y un novato de S.O.), pero si esta respuesta fuera un comentario, obtendría un voto positivo de mi parte. –

4

Ruby Programming/ASCII

En la versión anterior antes de rubí 1,9 , puedes usar la sintaxis del signo de interrogación.

?a 

Después de 1.9, utilizamos ord en su lugar.

'a'.ord  
Cuestiones relacionadas