Ruby — язык сверхвысокого уровня (VHLL). Один из принципов, положенных в основу его проектирования, заключается в том, что компьютер должен работать для человека, а не наоборот. Под «плотностью» Ruby понимают тот факт, что сложные, запутанные операции можно записать гораздо проще, чем в языках более низкого уровня.
Начнем мы с рассмотрения общего духа языка и некоторых применяемых в нем терминов. Затем вкратце обсудим природу программ на Ruby, а потом уже перейдем к примерам.
Прежде всего отметим, что программа на Ruby состоит из отдельных строк, — как в С, но не как в «древних» языках наподобие Фортрана. В одной строке может быть сколько угодно лексем, лишь бы они правильно отделялись пропусками.
В одной строке может быть несколько предложений, разделенных точками с запятой; только в этом случае точка с запятой и необходима. Логическая строка может быть разбита на несколько физических при условии, что все, кроме последней, заканчиваются обратной косой чертой или лексическому анализатору дан знак, что предложение еще не закончено. Таким знаком может, например, быть запятая в конце строки.
Главной программы как таковой (функции main
) не существует; исполнение происходит сверху вниз. В более сложных программах в начале текста могут располагаться многочисленные определения, за которыми следует (концептуально) главная программа. Но даже в этом случае программа исполняется сверху вниз, так как в Ruby все определения исполняются.
1.2.1. Ключевые слова и идентификаторы
Ключевые (или зарезервированные) слова в Ruby обычно не применяются ни для каких иных целей. Вот их полный перечень:
BEGIN END alias and begin
break case class def defined?
do else elsif end ensure
false for if in module
next nil not or redo
rescue retry return self super
then true undef unless until
when while yield
Имена переменных и других идентификаторов обычно начинаются с буквы или специального модификатора. Основные правила таковы:
• имена локальных переменных (и таких псевдопеременных, как self
и nil
) начинаются со строчной буквы или знака подчеркивания _
;
• имена глобальных переменных начинаются со знака доллара $
;
• имена переменных экземпляра (принадлежащих объекту) начинаются со знака «собачки» @
;
• имена переменных класса (принадлежащих классу) предваряются двумя знаками @
(@@
);
• имена констант начинаются с прописной буквы;
• в именах идентификаторов знак подчеркивания _ можно использовать наравне со строчными буквами;
• имена специальных переменных, начинающиеся со знака доллара (например, $1
и $/
), здесь не рассматриваются.
Примеры:
• локальные переменные alpha
, _ident
, some_var
;
• псевдопеременные self
, nil
, __FILE__
;
• константы K6chip
, Length
, LENGTH
;
• переменные экземпляра @foobar
, @thx1138
, @not_const
;
• переменные класса @@phydeaux
, @@my_var
, @@not_const
;
• глобальные переменные $beta
, $B2vitamin
, $not_const
.
1.2.2. Комментарии и встроенная документация
Комментарии в Ruby начинаются со знака решетки (#
), находящегося вне строки или символьной константы, и продолжаются до конца строки:
x = y + 5 # Это комментарий.
# Это тоже комментарий.
print "# А это не комментарий."
Предполагается, что встроенная документация будет извлечена из программы каким-нибудь внешним инструментом. С точки зрения интерпретатора это обычный комментарий. Весь текст, расположенный между строками, которые начинаются с лексем =begin
и =end
(включительно), игнорируется интерпретатором (этим лексемам не должны предшествовать пробелы).
=begin
Назначение этой программы - излечить рак
и установить мир во всем мире.
=end
1.2.3. Константы, переменные и типы
В Ruby переменные не имеют типа, однако объекты, на которые переменные ссылаются, тип имеют. Простейшие типы — это
Числовые константы интуитивно наиболее понятны, равно как и строки. В общем случае строка, заключенная в двойные кавычки, допускает интерполяцию выражений, а заключенная в одиночные кавычки интерпретируется почти буквально — в ней распознается только экранированная обратная косая черта.
Ниже показана «интерполяция» переменных и выражений в строку, заключенную в двойные кавычки:
а = 3
b = 79
puts "#{а} умноженное на #{b} = #{а*b}" # 3 умноженное на 79 = 237