Официальный FAQ по Ruby
If you wish to report errors or suggest improvements for this FAQ, please go to our GitHub repository and open an issue or pull request.
Общие вопросы
Что такое Ruby?
Ruby — это простой и мощный объектно-ориентированный язык программирования, созданный Yukihiro Matsumoto (который использует никнейм “Matz” в этом документе и в списках рассылки).
Подобно Perl, Ruby хорош в обработке текста. Подобно Smalltalk, все в Ruby является объектом, и в Ruby есть блоки, итераторы, метаклассы и другие хорошие вещи.
Вы можете использовать Ruby для написания серверов, экспериментов с прототипами и для повседневных задач программирования. Как полностью интегрированный объектно-ориентированный язык, Ruby хорошо масштабируется.
Возможности Ruby:
- Простой синтаксис,
- Базовые возможности ООП (классы, методы, объекты и так далее),
- Специальные возможности ООП (примеси, синглтон-методы, переименование и так далее),
- Перегрузка операторов,
- Обработка исключений,
- Итераторы и замыкания,
- Сборка мусора,
- Динамическая загрузка (в зависимости от архитектуры),
- Высокая переносимость (работает на различных Unices, Windows, DOS, macOS, OS/2, Amiga и так далее).
Покажите мне немного кода на Ruby!
Давайте определим класс с названием Person, с именем и возрастом. Мы проверим наш
код, создав несколько человек и изучив их.
class Person
attr_accessor :name, :age
def initialize(name, age)
@name = name
@age = age.to_i
end
def inspect
"#{name} (#{age})"
end
end
p1 = Person.new("Elmo", 4)
p2 = Person.new("Zoe", 7)
p1 # => Elmo (4)
p2 # => Zoe (7)
Теперь давайте заполним массив людей, считывая их имена и возраст из
файла ages, содержащего строки вида:
Bert: 8
Cookie: 11
Elmo: 4
Ernie: 8
Zoe: 7
Код использует регулярные выражения для парсинга последовательных строк из входного
файла, создавая новый объект Person для каждого совпадения и добавляя его в
конец массива people.
people = Array.new
File.foreach("ages") do |line|
people << Person.new($1, $2) if line =~ /(.*):\s+(\d+)/
end
people # => [Bert (8), Cookie (11), Elmo (4), Ernie (8), Zoe (7)]
Теперь давайте отсортируем результат на основе возраста человека. Существует множество способов сделать это. Мы можем определить блок сортировки, который указывает Ruby, как выполнять сравнение двух людей:
sorted = people.sort {|a, b| a.age <=> b.age }
sorted # => [Elmo (4), Zoe (7), Bert (8), Ernie (8), Cookie (11)]
Другим способом было бы изменение метода сравнения для класса Person:
class Person
def <=>(other)
age <=> other.age
end
end
people.sort # => [Elmo (4), Zoe (7), Bert (8), Ernie (8), Cookie (11)]
Почему название «Ruby»?
Под влиянием Perl, Matz хотел использовать имя драгоценного камня для своего нового языка, поэтому он назвал Ruby в честь камня рождения своего коллеги.
Позже он понял, что Ruby (рубин) идет сразу после Perl (жемчуг) в нескольких ситуациях. В камнях рождения жемчуг — это июнь, рубин — июль. При измерении размеров шрифта, pearl составляет 5pt, ruby — 5.5pt. Он подумал, что Ruby — хорошее имя для языка программирования, более нового (и, как мы надеемся, лучшего), чем Perl.
(Основано на объяснении от Matz в [ruby-talk:00394] от 11 июня 1999 года.)
Какова история Ruby?
Ниже приводится краткое изложение сообщения, сделанного от Matz в [ruby-talk:00382] от 4 июня 1999 года. (День рождения Ruby был исправлен в [ruby-list:15977].)
Что ж, Ruby родился 24 февраля 1993 года. Я разговаривал со своим коллегой о возможности создания объектно-ориентированного скриптового языка. Я знал Perl (Perl4, не Perl5), но он мне не очень нравился, потому что в нем чувствовался запах игрушечного языка (и до сих пор чувствуется). Объектно-ориентированный скриптовый язык казался очень многообещающим.
Я тогда знал Python. Но он мне не нравился, потому что я не считал его по-настоящему объектно-ориентированным языком — возможности ООП казались дополнением к языку. Как маньяк языков и фанат ООП с 15-летним стажем, я действительно хотел настоящий объектно-ориентированный, простой в использовании скриптовый язык. Я искал, но не смог такого найти.
Поэтому я решил создать его сам. Мне потребовалось несколько месяцев, чтобы заставить интерпретатор работать. Я добавил в него возможности, которые хотел бы видеть в своем языке, такие как итераторы, обработка исключений, сборка мусора.
Затем я реорганизовал возможности Perl в библиотеку классов и реализовал их. Я опубликовал Ruby 0.95 в японских внутренних новостных группах в декабре 1995 года.
С тех пор были созданы очень активные списки рассылки и сформированы веб-страницы.
Где находится домашняя страница Ruby?
Официальная домашняя страница Ruby — www.ruby-lang.org. Помимо английской и японской версий, существуют переводы на различные другие языки.
Хорошими отправными точками для поиска информации о Ruby являются страницы Документация и Сообщество.
Есть ли новостная группа по Ruby?
comp.lang.ruby была создана в мае 2000 года (спасибо усилиям Conrad Schneiker).
Есть ли список рассылки по Ruby?
Существует несколько списков рассылки, обсуждающих Ruby. Смотрите страницу Списки рассылки для получения дополнительной информации.
Вы можете искать по архивам списка рассылки с помощью https://ml.ruby-lang.org/archives/list/ruby-talk@ml.ruby-lang.org/. (Это URL для списка ruby-talk, измените его по мере необходимости для других).
Как я могу структурировать список рассылки по цепочкам в mutt?
This section or parts of it might be out-dated or in need of confirmation.
В некоторых списках рассылки по Ruby программное обеспечение списка добавляет префикс
к темам сообщений, например ruby-core:1234. Это может запутать
группировку по цепочкам (threading) в некоторых почтовых клиентах.
В mutt вы можете заставить группировку работать, используя следующую настройку переменной.
# reply regexp, to support MLs like ruby-talk.
set reply_regexp="^(\[[a-z0-9:-]+\][[:space:]]*)?(re([\[0-9\]+])*|aw):[[:space:]]*"
Как правильно, «Ruby» или «ruby»?
Официально язык называется «Ruby». На большинстве систем он вызывается
с помощью команды ruby. Допустимо использовать «ruby» вместо «Ruby».
Пожалуйста, не используйте «RUBY» в качестве названия языка.
Изначально, или исторически, он назывался «ruby».
Есть ли книги по Ruby?
This section or parts of it might be out-dated or in need of confirmation.
-
Programming Ruby: The Pragmatic Programmer’s Guide, (книга с киркой) от David Thomas и Andrew Hunt: ISBN 0-20171-089-7, Addison-Wesley, октябрь 2000.
-
Справочник по Ruby на японском языке от Matz и других, изданный ASCII, доступен в Японии (ISBN 4-7561-3254-5). Английский перевод, «The Ruby Programming Language», доступен от O’Reilly & Associates (ISBN 978-0596516178).
-
«Ruby Pocket Reference» на японском языке издан O’Reilly Japan (ISBN 4-87311-023-8). Сообщите O’Reilly в США, если хотите увидеть перевод.
-
Кроме того, «Mastering Regular Expressions» от Jeffrey Friedl, (книга с совой): ISBN 1-56592-257-3 от O’Reilly & Associates, — это справочник, который охватывает искусство и реализацию регулярных выражений в различных языках программирования. Большая часть из этого крайне актуальна для регулярных выражений в Ruby.
Какие редакторы поддерживают Ruby?
This section or parts of it might be out-dated or in need of confirmation.
- Emacs
или XEmacs:
ruby-mode.elпоставляется в дистрибутиве Ruby. В некоторых версиях XEmacs вам может потребоваться добавить(load "font-lock")в ваш файл.emacs, чтобы позволитьruby-mode.elобнаружить пакет подсветки синтаксиса, который вы используете. - Vim: Vim 5.7 и более поздние версии имеют файлы синтаксиса Ruby в качестве стандарта в пакете среды выполнения. Для предыдущих версий файл синтаксиса для Ruby доступен на http://www.xs4all.nl/~hipster/lib/ruby/ruby.vim.
- Jedit: Портативный редактор, написанный на Java, поставляется с поддержкой Ruby.
- Barry Shultz написал файл определений Ruby для TextPad, доступный на https://www.textpad.com/add-ons/synn2t.html.
Как я могу аннотировать код на Ruby его результатами?
This section or parts of it might be out-dated or in need of confirmation.
Люди часто аннотируют код на Ruby, показывая результаты выполнения каждого выражения в виде комментария, прикрепленного к этому выражению. Например, в следующем коде мы показываем, что присваивание генерирует строку “Billy Bob”, а затем результат извлечения некоторых подстрок.
str = "Billy" + " Bob" # => "Billy Bob"
str[0,1] + str[2,1] + str[-2,2] # => "Blob"
Пользователи Emacs и vim могут интегрировать это в свои среды редактирования, что
полезно, если вы хотите отправлять людям электронные письма с аннотированным кодом на Ruby. Установив
xmp, пользователи Emacs могут добавить следующее в свой файл .emacs:
(defun ruby-xmp-region (reg-start reg-end)
"Pipe the region through Ruby's xmp utility and replace the region with
the result."
(interactive "r")
(shell-command-on-region reg-start reg-end
"ruby -r xmp -n -e 'xmp($_, \"%l\t\t# %r\n\")'"
t))
(global-set-key [(meta f10)] 'ruby-xmp-region)
Пользователи Vim могут использовать маппинг (спасибо hipster):
map <M-F10> :!ruby -r xmp -n -e 'xmp($_, "\%l\t\t\# \%r\n")'<CR>
В обоих случаях выделите область кода и нажмите Meta-F10 для ее аннотирования.
Я не могу понять Ruby даже после прочтения руководства!
This section or parts of it might be out-dated or in need of confirmation.
Синтаксис Ruby был довольно стабильным начиная с Ruby 1.0, но время от времени добавляются новые возможности. Поэтому книги и онлайн-документация могут устаревать.
Если у вас возникла проблема, не стесняйтесь задавать вопросы в списке рассылки (смотрите страницу Списки рассылки). Обычно вы получите своевременные ответы от Matz, автора языка, от других гуру и от тех, кто уже решил проблемы, похожие на вашу.
Пожалуйста, включайте вывод ruby -v вместе с любым проблемным
исходным кодом.
Если у вас возникла проблема с использованием irb,
имейте в виду, что у него есть некоторые ограничения.
Попробуйте запустить скрипт с помощью irb --single-irb, или напрямую используя
команду ruby.
В списке рассылки могут быть похожие вопросы, и хорошим сетевым этикетом является чтение недавних писем (RFC1855:3.1.1, 3.1.2) перед тем, как задать вопрос. Но обязательно спрашивайте в списке, и правильный ответ не заставит себя ждать.