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

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

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

    >> 65.chr A 

    Достаточно ярмарка. Но как ты пойти по другому пути?

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

    принты:

    65 

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

  • Ответы

  • Если строка#ОГА не было в 1.9, то ли в 2.0:

    "A".ord #=> 65 

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

    puts ?A 'A'[0] 

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

    'A'[0].ord 

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

    Попробовать:

    'A'.unpack('c') 

    Я бы хотел +1 dylanfm и комментировать AShelly, но и добавить [0]:

    'A'.unpack('C')[0]

    Распаковка вызов возвращает массив, содержащий одно число, которое является не всегда принимаются, если целое находится в розыске:

     $ Рубина -е 'функции printf("значение 0x%02X\П", "А".распакуйте("С"))' -Е:1:В `Е': не может преобразовать массив в целое число (TypeError) С -Е:1 $ Рубин -е 'функции printf("значение 0x%02X\П", "А".распакуйте("с")[0])' 0x41 $ 

    Я пытаюсь написать код, который работает на Ruby 1.8.1, 1.8.7 и 1.9.2.

    Отредактированы, чтобы пройти с нужно распаковать в верхнем регистре, потому что распаковать("с") дает мне -1, где орд() дает мне 255 (несмотря на то, работающих на платформе где со знаком типа char в C есть).

    Кроме того, если у вас есть char в строку, и вы хотите, чтобы расшифровать его без петли:

    puts 'Az'[0] => 65 puts 'Az'[1] => 122 

    Как насчет

    ставит ?А

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

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

    Просто столкнулись с этим при составлении чистая версия Ruby Stringprep через Рлк.

    Помните, что chr не удается извне [0,255], вместо использования 1.9.х - 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

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