Qual è l'opposto di chr () in Ruby?
Domanda
In molte lingue c'è una coppia di funzioni, chr ()
e ord ()
, che convertono tra numeri e valori dei caratteri. In alcune lingue, ord ()
è chiamato asc ()
.
Ruby ha Integer # chr
, che funziona alla grande:
>> 65.chr
A
Abbastanza giusto. Ma come vai dall'altra parte?
"A".each_byte do |byte|
puts byte
end
stampe:
65
ed è abbastanza vicino a quello che voglio. Ma preferirei davvero evitare un ciclo: sto cercando qualcosa di abbastanza breve da essere leggibile quando dichiari una const
.
Soluzione
Se String # ord non esisteva in 1.9, lo fa in 2.0:
"A".ord #=> 65
Altri suggerimenti
In Ruby fino alla serie 1.8 inclusa, le seguenti produrranno entrambe 65 (per ASCII):
puts ?A
'A'[0]
Il comportamento in Ruby 1.9 è cambiato, entrambi i punti precedenti produrranno "A" anziché. Il modo corretto per farlo in Ruby 1.9 è:
'A'[0].ord
Sfortunatamente, il metodo ord
non esiste in Ruby 1.8.
Prova:
'A'.unpack('c')
Mi piacerebbe fare +1 su dylanfm e sul commento di AShelly ma aggiungere [0]:
'A'.unpack (' C ') [0]
La chiamata di decompressione restituisce un array contenente un singolo numero intero, che non è sempre accettato dove si desidera un numero intero:
$ ruby -e 'printf("0x%02X\n", "A".unpack("C"))' -e:1:in `printf': can't convert Array into Integer (TypeError) from -e:1 $ ruby -e 'printf("0x%02X\n", "A".unpack("C")[0])' 0x41 $
Sto cercando di scrivere codice che funzioni su Ruby 1.8.1, 1.8.7 e 1.9.2.
Modificato per passare C per decomprimere in maiuscolo, perché unpack (& ??quot; c ") mi dà -1 dove ord () mi dà 255 (nonostante sia in esecuzione su una piattaforma in cui il carattere di C è firmato).
Mi sono appena imbattuto in questo mentre mettevo insieme una versione Ruby pura di Stringprep tramite RFC.
Attenzione che chr
ha esito negativo al di fuori di [0,255], utilizza invece i sostituti portatili 1.9.x - 2.1.x:
[22] pry(main)> "\u0221".ord.chr
RangeError: 545 out of char range
from (pry):2:in 'chr'
[23] pry(main)> x = "\u0221".unpack('U')[0]
=> 545
[24] pry(main)> [x].pack('U')
=> "ȡ"
[25] pry(main)>
Inoltre, se hai il carattere in una stringa e vuoi decodificarlo senza un ciclo:
puts 'Az'[0]
=> 65
puts 'Az'[1]
=> 122
Che ne dici
mette? A
Se non ti dispiace estrarre i valori da un array, puoi usare "A".bytes
Puoi avere questi:
65.chr.ord
'a'.ord.chr
Sto scrivendo il codice per 1.8.6 e 1.9.3 e non sono riuscito a far funzionare nessuna di queste soluzioni in entrambi gli ambienti :(
Tuttavia, ho trovato un'altra soluzione: http://smajnr.net /2009/12/ruby-1-8-nomethoderror-undefined-method-ord-for-string.html
Neanche questo ha funzionato per me, ma l'ho adattato per il mio uso:
unless "".respond_to?(:ord)
class Fixnum
def ord
return self
end
end
end
Fatto ciò, allora funzionerà in entrambi gli ambienti
'A'[0].ord