Почему «? B» означает «b» в Ruby? - PullRequest
4 голосов
/ 18 марта 2009
"foo"[0] = ?b # "boo"

Я смотрел на приведенный выше пример и пытался выяснить:

  1. Как «? B» подразумевает символ «b»?
  2. Зачем это нужно? - Не мог бы я просто написать это:

    "foo" [0] = 'b' # "boo"

Ответы [ 4 ]

10 голосов
/ 18 марта 2009

Эд Свангрен:? возвращает код символа характер.

Нет в Ruby 1.9. Начиная с 1.9, ?a возвращает 'a'. Смотрите здесь: Сын из 10 вещей, о которых нужно знать в Ruby 1.9!

telemachus ~ $ ~/bin/ruby -v
ruby 1.9.1p0 (2009-01-30 revision 21907) [i686-linux]
telemachus ~ $ ~/bin/ruby -e 'char = ?a; puts char'
a
telemachus ~ $ /usr/bin/ruby -v
ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]
telemachus ~ $ /usr/bin/ruby -e 'char = ?a; puts char'
97

Редактировать: A очень полное описание изменений в Ruby 1.9 .

Другое редактирование: обратите внимание, что теперь вы можете использовать 'a'.ord, если хотите, чтобы преобразование строки в число вы получили в 1.8 через ?a.

5 голосов
/ 18 марта 2009

Изменение связано с обновлениями UTF-8 в Ruby 1.9.

Версия Ruby 1.8 ? работала только с однобайтовыми символами. В версии 1.9 обновлено все для работы с многобайтовыми символами. Проблема в том, что не ясно, какое целое число должно возвращаться из ?€.

Они решили это, изменив то, что он возвращает. В 1.9 все перечисленные ниже являются одноэлементными строками и эквивалентны:

?€
'€'
"€"
"\u20AC"
?\u20AC

Им следовало бы отказаться от обозначения IMO, а не (несколько случайно) изменить поведение. Это даже официально не рекомендуется.

0 голосов
/ 19 марта 2009

В некоторых языках (Pascal, Python) символы не существуют: это просто строки длины 1.

В других языках (C, Lisp) символы существуют и имеют различный синтаксис, например 'x' или # \ x.

Руби в основном была на стороне "символов не существует", но порой казалось, что не совсем уверена в этом выборе. Если вы действительно хотите использовать символы в качестве типа данных, Ruby уже присваивает значения символам '' и "", так что? X выглядит примерно таким же разумным, как и любая другая опция для литералов символов.

Для меня это просто вопрос, что вы имеете в виду. С таким же успехом вы можете сказать foo [0] = 98, но вы используете целое число, когда вы действительно имеете в виду символ. Использование строки, когда вы имеете в виду символ, выглядит для меня одинаково странным: набор операций, которые они поддерживают, почти полностью отличается. Один - это последовательность другого. Вы бы не заставляли Math.sqrt брать список чисел, а просто смотреть только на первое. Вы не должны опускать "integer" из языка только потому, что вы уже поддерживаете "list of integer".

(На самом деле Lisp 1.0 делал именно это - церковные цифры для всего! - но производительность была ужасной, так что это был один из огромных достижений Lisp 1.5, который сделал его пригодным для использования в качестве реального языка, еще в 1962 году.)

0 голосов
/ 18 марта 2009
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...