2009-08-13 11 views
42

Sono in una situazione in cui ho bisogno del valore ASCII di un carattere (per Project Euler question #22, se si vuole ottenere specifico) e sto correndo in un problema.Ottenere un codice di carattere ASCII in Ruby usando `?` (Punto interrogativo) non riesce

Essendo nuovo al ruby, l'ho cercato su google e ho trovato che ? era la strada da percorrere: ?A o qualsiasi altra cosa. Ma quando lo incorporo nel mio codice, il risultato di tale affermazione è la stringa "A" -no codice carattere. Stesso problema con [0] e slice(0), entrambi i quali dovrebbero in teoria restituire il codice ASCII.

L'unica cosa che posso pensare è che questo è un problema di versione rubino. Sto usando 1.9.1-p0, dopo aver aggiornato da 1.8.6 questo pomeriggio. Ho imbrogliato un po 'passando da una versione funzionante di Ruby, nella stessa directory, ho pensato che probabilmente avevo già i file che non sono inclusi nel file .zip, quindi non li ho scaricati.

Quindi, perché esattamente tutti i miei codici ASCII vengono trasformati in caratteri reali?

risposta

62

Rubino prima di 1.9 caratteri trattati in modo incoerente. ?a e "a"[0] restituirebbero un numero intero che rappresenta il valore ASCII del carattere (che in genere non era il comportamento che le persone stavano cercando), ma in pratica i caratteri sarebbero normalmente rappresentati da una stringa di un carattere. In Ruby 1.9, i personaggi non sono mai misteriosamente trasformati in numeri interi. Se si desidera ottenere il valore ASCII di un carattere, è possibile utilizzare il metodo ord, ad esempio ?a.ord (che restituisce 97).

+0

Solo per completare, la versione 1.9.3 o successiva non necessita '?' segno prima della lettera, possiamo ottenere il valore intero solo con: a.ord – yat0

+3

@polska: Penso che potresti aver frainteso. Il ? significa che vogliamo il carattere 'a', quindi scrivere '? a.ord' dà 97, mentre semplicemente scrivere' a.ord' cerca una variabile o un metodo chiamato 'a' e getterà un NameError se non c'è nulla con quel nome o un NoMethodError se la variabile 'a' non contiene una stringa. – Chuck

+1

sì, hai ragione .. Ho frainteso. Funziona con? A.ord o "a" .ord – yat0

7

Trovato la soluzione. "string" .ord restituisce il codice ASCII di s. Sembra che i metodi che ho trovato siano infranti nella serie 1.9 di rubini.

+1

È meglio modificare il post originale anziché postare una risposta separata alla propria domanda. – pierrotlefou

+7

@pierr - Ma questa è una risposta alla domanda, non solo un aggiornamento della domanda – rampion

+5

I metodi non sono infranti. Ruby 1.9 definisce il loro comportamento in modo diverso, come ha spiegato Chuck. – Telemachus

10

Per 1,8 e 1,9

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

o

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

Quest'ultimo errore per me in 1.8.7: '>>" a ".class == String? "a" .ord: "a" [0] 'produce errore ' NoMethodError: metodo non definito \ 'ord 'per" a ": String da (irb): 3' –

32

Come su

"a"[0].ord 

per 1,8/1,9 portabilità.

-2

Se si legge di nuovo la domanda 22 del progetto Eulero, si scopre che non si cercano i valori ASCII dei caratteri. Che la questione sta cercando, per il carattere "A", per esempio è 1, la sua posizione in alfabeto dove come "A" ha un valore ASCII di 65.

+1

Sicuramente potresti ottenere la posizione nell'alfabeto sottraendo 64 dal valore ASCII della lettera maiuscola. Questa risposta dovrebbe essere un commento. –

+0

@NilsLuxton, Forse questo dovrebbe essere un commento, ma è una risposta migliore alla domanda che stanno cercando. Se si legge la domanda Eulero di progetto a cui si fa riferimento, il valore ACSII non è quello che stanno cercando. Non meritavo un voto negativo. – Schechter

+2

La domanda era "Come ottengo il valore ASCII di un carattere" non "Qualcuno può chiarire # 22 in Project Euler". La menzione del problema in questione è solo un contesto. La loro soluzione potrebbe benissimo (e probabilmente lo farà) coinvolgere prima il rilevamento del valore ASCII e il calcolo da quel momento in poi. Sono sicuro che l'OP apprezza il tuo chiarimento, ma così com'è, non è una risposta alla domanda che hanno posto. Probabilmente sono un po 'severo sulle regole (e su un NOOB), ma se questa risposta fosse un commento, otterrebbe un risultato positivo da parte mia. –

4

Ruby Programming/ASCII

Nella precedente versione rubino prima 1.9 , puoi usare la sintassi del punto interrogativo.

?a 

Dopo 1.9, usiamo invece ord.

'a'.ord  
Problemi correlati