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 .

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top