Что противоположно chr () в Ruby?


во многих языках есть пара функций, chr() и ord(), что преобразования между числами и символьными значениями. На некоторых языках, ord() называется asc().

у Руби есть Integer#chr, который прекрасно работает:

>> 65.chr
A

справедливо. Но как вы идете в другую сторону?

"A".each_byte do |byte|
   puts byte
end

принты:

65

и это довольно близко к тому, что я хочу. Но я бы предпочел избежать петли-я ищу что-то достаточно короткое, чтобы быть читается при объявлении const.

10 90

10 ответов:

если строка#ord не существовала в 1.9, она существует в 2.0:

"A".ord #=> 65

в Ruby до и включая серии 1.8, следующие оба произведут 65 (для ASCII):

puts ?A
'A'[0]

поведение изменилось в Ruby 1.9, оба из вышеперечисленных будут производить "A" вместо этого. Правильный способ сделать это в Ruby 1.9 это:

'A'[0].ord

к сожалению,ord метод не существует в Ruby 1.8.

попробуй:

'A'.unpack('c')

Я хотел бы + 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)>

как о

ставит ?А

Если вы не против вытащить значения из массива, вы можете использовать "A".bytes

вы можете:

65.chr.ord
'a'.ord.chr

Я пишу код для 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