O que é o oposto de chr () em Ruby?
Pergunta
Em muitas línguas há um par de funções, chr()
e ord()
, que convertem entre números e valores de caracteres. Em alguns idiomas, ord()
é chamado asc()
.
Ruby tem Integer#chr
, que funciona muito bem:
>> 65.chr
A
É justo. Mas como você ir por outro caminho?
"A".each_byte do |byte|
puts byte
end
impressões:
65
e isso é muito perto do que eu quero. Mas eu realmente prefiro evitar um loop -. Eu estou procurando algo curto o suficiente para ser lido ao declarar uma const
Solução
Se String # ord não existia no 1.9, que faz em 2.0:
"A".ord #=> 65
Outras dicas
Em Ruby até e incluindo a série 1.8, o seguinte será tanto produzir 65 (para ASCII):
puts ?A
'A'[0]
O comportamento mudou no Ruby 1.9, ambos acima irá produzir "A" em seu lugar. A maneira correta de fazer isso em Ruby 1.9 é:
'A'[0].ord
Infelizmente, o método ord
não existe no Ruby 1.8.
Tente:
'A'.unpack('c')
Eu gostaria de um dylanfm e comentário de AShelly mas adicionar a [0]:
'A'.unpack('C')[0]
A chamada descompactar retorna um array contendo um único inteiro, o que nem sempre é aceito, onde um inteiro é procurado:
$ 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 $
Eu estou tentando escrever código que funciona em Rubi 1.8.1, 1.8.7 e 1.9.2.
Editado passar C para desempacotar em maiúsculas, porque descompactar ( "c") me -1 dá onde ord () me dá 255 (apesar de correr em uma plataforma onde caractere de C é assinado).
Apenas me deparei com este ao montar uma versão Ruby puro de Stringprep via RFCs.
Tenha em atenção que chr
falhar fora [0255], em vez usar 1.9.x - 2.1.x substituições portáteis:
[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)>
Além disso, se você tem o caractere em uma string e você quer para decodificá-lo sem um loop:
puts 'Az'[0]
=> 65
puts 'Az'[1]
=> 122
Como cerca
puts? A
Se você não se importa puxando os valores de um array, você pode usar "A".bytes
Você pode ter estes:
65.chr.ord
'a'.ord.chr
Eu estou escrevendo código para 1.8.6 e 1.9.3 e eu não poderia obter qualquer destas soluções para trabalhar nos dois ambientes: (
No entanto, me deparei com uma outra solução: http://smajnr.net /2009/12/ruby-1-8-nomethoderror-undefined-method-ord-for-string.html
Isso não funcionou para mim também, mas eu adaptei-lo para o meu uso:
unless "".respond_to?(:ord)
class Fixnum
def ord
return self
end
end
end
Depois de ter feito isso, então o seguinte irá trabalhar em ambientes
'A'[0].ord