Что противоположно chr () в Ruby?
во многих языках есть пара функций, chr()
и ord()
, что преобразования между числами и символьными значениями. На некоторых языках, ord()
называется asc()
.
у Руби есть Integer#chr
, который прекрасно работает:
>> 65.chr
A
справедливо. Но как вы идете в другую сторону?
"A".each_byte do |byte|
puts byte
end
принты:
65
и это довольно близко к тому, что я хочу. Но я бы предпочел избежать петли-я ищу что-то достаточно короткое, чтобы быть читается при объявлении const
.
10 ответов:
в Ruby до и включая серии 1.8, следующие оба произведут 65 (для ASCII):
puts ?A 'A'[0]
поведение изменилось в Ruby 1.9, оба из вышеперечисленных будут производить "A" вместо этого. Правильный способ сделать это в Ruby 1.9 это:
'A'[0].ord
к сожалению,
ord
метод не существует в Ruby 1.8.
Я хотел бы + 1 dylanfm и комментарий AShelly, но добавить [0]:
'A'.unpack('C')[0]
вызов unpack возвращает массив, содержащий одно целое число, которое не всегда принимается там, где требуется целое число:
$ 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 $Я пытаюсь написать код, который работает на Ruby 1.8.1, 1.8.7 и 1.9.2.
отредактировано для передачи C для распаковки в верхнем регистре, потому что распаковка("c") дает мне -1, где ord () дает мне 255 (несмотря на то, что работает на платформе, где символ C подписан.)
кроме того, если у вас есть символ в строке, и вы хотите декодировать его без цикла:
puts 'Az'[0] => 65 puts 'Az'[1] => 122
просто сталкивался с этим, пока собираю чистого рубинового версия для обмена сообщениями между приложениями через РЛК.
помните, что
chr
сбой снаружи [0,255], вместо этого используйте 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)>
Я пишу код для 1.8.6 и 1.9.3 и я не мог получить любое из этих решений работать в обеих средах :(
однако, я наткнулся на другое решение: http://smajnr.net/2009/12/ruby-1-8-nomethoderror-undefined-method-ord-for-string.html
это тоже не сработало для меня, но я адаптировал его для своего использования:
unless "".respond_to?(:ord) class Fixnum def ord return self end end end
сделав это, то следующее будет работать в обоих окружающая среда
'A'[0].ord