Говорят, что 'c' - это символ или строка в Ruby - или оба? - PullRequest
4 голосов
/ 06 апреля 2009
char hello[] = "hello"; #C
hello = ['h', 'e', 'l', 'l', 'o'] #Ruby

Если я вывожу класс hello [0] в Ruby, он говорит "String". Это связано с тем, что в Ruby существуют строки в одинарных кавычках, и, похоже, нет понятия типа char. На днях я сказал своему коллеге, что у него есть набор символов, и он сказал: «Нет, у меня нет набора строк». Nitpicky, да, но технически, возможно, он прав. Исходя из мира Си, я не склонен думать о единственном персонаже как о Строке. Согласны ли вы с тем, что приведенный выше массив hello является массивом строк, а не массивом символов?

Ответы [ 4 ]

13 голосов
/ 06 апреля 2009

В C символ отличается от строки (которая является массивом символов). Рубин не имеет индивидуального типа символов. Строки могут содержать любое количество символов, а Fixnums могут содержать значение ASCII для символа и могут быть преобразованы в печатную строку, содержащую этот символ, с помощью метода #chr.

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

2 голосов
/ 06 апреля 2009

Да. В то время как в C строка представлена ​​как C-String, которая представляет собой массив символов с нулевым символом в конце, String в Ruby - это класс, который хранит свое содержимое более сложным способом. Вы можете извлечь любую его часть в новую строку, и Ruby, вероятно, не даст вам более низкий доступ к ней. В C вы получаете прямой доступ к памяти, Ruby гораздо более абстрактный, чем этот.

2 голосов
/ 06 апреля 2009

Ваш коллега был бы прав, у Руби, похоже, нет никакого класса персонажей.

>> 'c'.class                                                            
=> String
0 голосов
/ 06 апреля 2009

Да, в Ruby нет класса char, есть только String. (Обратите внимание, что char определяется как 1 байт в стандарте C, но это не относится к символам Unicode).

...