2009-08-13 4 views
42

Я в ситуации, когда мне нужно значение ASCII символа (для Project Euler question #22, если вы хотите уточнить), и я запускаю в проблему.Получение символьного кода ASCII в Ruby с использованием `?` (Вопросительный знак) не удается

Будучи новым для рубинов, я нашел его в Google, и обнаружил, что ? был способ пойти: ?A или что-то еще. Но когда я включаю его в свой код, результатом этого оператора является строка "A" -no символьный код. Тот же выпуск с [0] и slice(0), оба из которых должны теоретически возвращать код ASCII.

Единственное, что я могу придумать, это проблема с рубиновой версией. Я использую 1.9.1-p0, обновленный с 1.8.6 днем. Я немного обманывал рабочую версию Ruby, в том же каталоге, я полагал, что у меня, вероятно, уже есть файлы, которые не входят в комплект с .zip-файлом, поэтому я не загружал их.

Так почему же именно все мои коды ASCII превращаются в настоящих персонажей?

ответ

62

Ruby до 1.9 обработанных символов несколько непоследовательно. ?a и "a"[0] возвращают целое число, представляющее значение ASCII символа (которое обычно не было тем, что искали люди), но в практическом использовании символы обычно представляются односимвольной строкой. В Ruby 1.9 персонажи никогда не таинственно превращаются в целые числа. Если вы хотите получить значение ASCII символа, вы можете использовать метод ord, например ?a.ord (который возвращает 97).

+0

Просто для завершения, версия 1.9.3 или новее не нужна?? перед письмом мы можем получить значение Integer только с: a.ord – yat0

+3

@polska: Я думаю, вы, возможно, неправильно поняли. ? означает, что нам нужен символ «a», поэтому запись '? a.ord' дает 97, тогда как простое написание' a.ord' ищет переменную или метод под названием 'a' и будет вызывать NameError, если нет ничего с этим именем или NoMethodError, если переменная 'a' не содержит строку. – Chuck

+1

Да, ты прав. Я неправильно понял. Он работает с? A.ord или «a» .ord – yat0

7

Найдено решение. «string» .ord возвращает ascii-код s. Похоже, что найденные мной методы были разбиты на 1,9 серии рубинов.

+1

Лучше отредактировать исходное сообщение, а не размещать выделенный ответ на свой вопрос. – pierrotlefou

+7

@pierr - Но это ответ на вопрос, а не просто обновление вопроса – rampion

+5

Методы не нарушены. Ruby 1.9 определяет свое поведение по-разному, как объяснил Чак. – Telemachus

10

Для 1,8 и 1,9

?a.class == String ? ?a.ord : ?a 

или

"a".class == String ? "a".ord : "a"[0] 
+1

Эта последняя ошибка для меня на 1.8.7: '>>« a ».class == String? "a" .ord: "a" [0] 'создает ошибку ' NoMethodError: undefined method \ 'ord 'для" a ": String from (irb): 3' –

32

Как насчет

"a"[0].ord 

1,8/1,9 портативности.

-2

Если вы снова прочитали вопрос 22 из проекта Euler, вы обнаружите, что вы не ищете значения ASCII символов. Что вопрос ищет, для символа «A», например, является 1, его положение в алфавите, где, как «A» имеет значение ASCII 65.

+1

Конечно, вы могли бы получить позицию в алфавите путем вычитания 64 из значения ASCII заглавной буквы. Этот ответ должен быть комментарием. –

+0

@NilsLuxton, Возможно, это должен был быть комментарий, но это лучший ответ на фактический вопрос, который они ищут. Если вы прочитаете вопрос Project Euler, на который ссылается, значение ACSII не то, что они ищут. Не заслужил ни единого голоса. – Schechter

+2

Вопрос: «Как получить значение ASCII символа», а не «Может ли кто-нибудь уточнить № 22 в Project Euler». Упоминание о проблеме - это просто контекст. Их решение вполне может (и, скорее всего, имеет значение) включать в себя сначала поиск значения ASCII и вычисление с этого момента. Я уверен, что ОП ценит ваше разъяснение, но, поскольку он стоит, это не ответ на вопрос, который они задали. Вероятно, я немного строгу по правилам здесь (и S.O. noob), но если бы этот ответ был комментарием, он получил бы от меня верхнюю позицию. –

4

Ruby Programming/ASCII

В предыдущей версии рубинового до 1.9 , вы можете использовать синтаксис вопросительного знака.

?a 

После 1.9 вместо этого мы используем ord.

'a'.ord