Что противоположно chr () в Ruby? - PullRequest
96 голосов
/ 21 ноября 2008

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

Ruby имеет Integer#chr, который прекрасно работает:

>> 65.chr
A

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

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

печать:

65

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

Ответы [ 10 ]

79 голосов
/ 10 декабря 2013

Если String # ord не существует в 1.9, он существует в 2.0:

"A".ord #=> 65
33 голосов
/ 21 ноября 2008

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

puts ?A
'A'[0]

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

'A'[0].ord

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

13 голосов
/ 21 ноября 2008

Попробуйте:

'A'.unpack('c')
10 голосов
/ 27 мая 2011

Я хотел бы +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 для распаковки в верхнем регистре, потому что unpack ("c") дает мне -1, где ord () дает мне 255 (несмотря на запуск на платформе, где символ C подписан).

3 голосов
/ 05 апреля 2014

Только что столкнулся с этим, когда собирал чистую версию Stringprep для Ruby через RFC.

Помните, что 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)>
3 голосов
/ 21 ноября 2008

Кроме того, если у вас есть символ в строке и вы хотите декодировать его без цикла:

puts 'Az'[0]
=> 65
puts 'Az'[1]
=> 122
2 голосов
/ 25 мая 2014

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

2 голосов
/ 21 ноября 2008

Как насчет

ставит? A

1 голос
/ 10 марта 2014

Вы можете иметь эти:

65.chr.ord
'a'.ord.chr
0 голосов
/ 13 апреля 2015

Я пишу код для 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...