_If you wish to report errors or suggest improvements for this FAQ,
please go to our
[GitHub repository](https://github.com/ruby/www.ruby-lang.org/)
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\]][ruby-talk:00394]
от 11 июня 1999 года.)

[ruby-talk:00394]: https://blade.ruby-lang.org/ruby-talk/394

### Какова история Ruby?

Ниже приводится краткое изложение сообщения, сделанного от Matz в
[\[ruby-talk:00382\]][ruby-talk:00382] от 4 июня 1999 года.
(День рождения Ruby был исправлен в
[\[ruby-list:15977\]][ruby-list:15977].)

> Что ж, Ruby родился 24 февраля 1993 года. Я разговаривал со своим коллегой
> о возможности создания объектно-ориентированного скриптового языка. Я знал Perl
> (Perl4, не Perl5), но он мне не очень нравился, потому что в нем чувствовался запах
> игрушечного языка (и до сих пор чувствуется). Объектно-ориентированный скриптовый язык казался
> очень многообещающим.

> Я тогда знал Python. Но он мне не нравился, потому что я не считал его
> по-настоящему объектно-ориентированным языком — возможности ООП казались дополнением к
> языку. Как маньяк языков и фанат ООП с 15-летним стажем, я действительно хотел
> настоящий объектно-ориентированный, простой в использовании скриптовый язык. Я искал, но
> не смог такого найти.

> Поэтому я решил создать его сам. Мне потребовалось несколько месяцев, чтобы заставить
> интерпретатор работать. Я добавил в него возможности, которые хотел бы видеть в своем языке, такие как
> итераторы, обработка исключений, сборка мусора.

> Затем я реорганизовал возможности Perl в библиотеку классов и
> реализовал их. Я опубликовал Ruby 0.95 в японских внутренних новостных группах
> в декабре 1995 года.

> С тех пор были созданы очень активные списки рассылки и
> сформированы веб-страницы.

[ruby-talk:00382]: https://blade.ruby-lang.org/ruby-talk/382
[ruby-list:15977]: https://blade.ruby-lang.org/ruby-list/15977

### Где находится домашняя страница Ruby?

Официальная домашняя страница Ruby — [www.ruby-lang.org](https://www.ruby-lang.org).
Помимо английской и японской версий, существуют переводы
на различные другие языки.

Хорошими отправными точками для поиска информации о Ruby являются страницы
[Документация](/ru/documentation/) и [Сообщество](/ru/community/).

### Есть ли новостная группа по Ruby?

comp.lang.ruby была создана в мае 2000 года (спасибо усилиям
[Conrad Schneiker](mailto:schneiker@jump.net)).

### Есть ли список рассылки по Ruby?

Существует несколько списков рассылки, обсуждающих Ruby. Смотрите страницу
[Списки рассылки](/ru/community/mailing-lists/)
для получения дополнительной информации.

Вы можете искать по архивам списка рассылки с помощью
[https://ml.ruby-lang.org/archives/list/ruby-talk@ml.ruby-lang.org/](https://ml.ruby-lang.org/archives/list/ruby-talk@ml.ruby-lang.org/).
(Это URL для списка ruby-talk, измените его по мере необходимости для других).

### Как я могу структурировать список рассылки по цепочкам в mutt?

<div class="not-prose bg-ruby-100 dark:bg-ruby-800 rounded-lg p-8 my-6">
  <div class="flex items-start gap-3">
    <svg class="w-6 h-6 text-ruby-700 dark:text-ruby-200 flex-shrink-0 mt-0.5" fill="currentColor" viewBox="0 0 20 20">
      <path fill-rule="evenodd" d="M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495zM10 5a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 5zm0 9a1 1 0 100-2 1 1 0 000 2z" clip-rule="evenodd"/>
    </svg>
    <p class="text-sm text-ruby-700 dark:text-ruby-200 italic">
      This section or parts of it might be out-dated or in need of confirmation.
    </p>
  </div>
</div>


В некоторых списках рассылки по 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?

<div class="not-prose bg-ruby-100 dark:bg-ruby-800 rounded-lg p-8 my-6">
  <div class="flex items-start gap-3">
    <svg class="w-6 h-6 text-ruby-700 dark:text-ruby-200 flex-shrink-0 mt-0.5" fill="currentColor" viewBox="0 0 20 20">
      <path fill-rule="evenodd" d="M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495zM10 5a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 5zm0 9a1 1 0 100-2 1 1 0 000 2z" clip-rule="evenodd"/>
    </svg>
    <p class="text-sm text-ruby-700 dark:text-ruby-200 italic">
      This section or parts of it might be out-dated or in need of confirmation.
    </p>
  </div>
</div>


* 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?

<div class="not-prose bg-ruby-100 dark:bg-ruby-800 rounded-lg p-8 my-6">
  <div class="flex items-start gap-3">
    <svg class="w-6 h-6 text-ruby-700 dark:text-ruby-200 flex-shrink-0 mt-0.5" fill="currentColor" viewBox="0 0 20 20">
      <path fill-rule="evenodd" d="M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495zM10 5a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 5zm0 9a1 1 0 100-2 1 1 0 000 2z" clip-rule="evenodd"/>
    </svg>
    <p class="text-sm text-ruby-700 dark:text-ruby-200 italic">
      This section or parts of it might be out-dated or in need of confirmation.
    </p>
  </div>
</div>


* [Emacs](http://www.gnu.org/software/emacs/emacs.html)
  или [XEmacs](http://www.xemacs.org/): `ruby-mode.el` поставляется в дистрибутиве
  Ruby. В некоторых версиях XEmacs вам может потребоваться добавить
  `(load "font-lock")` в ваш файл `.emacs`, чтобы позволить `ruby-mode.el` обнаружить
  пакет подсветки синтаксиса, который вы используете.
* [Vim](http://www.vim.org/): Vim 5.7 и более поздние версии имеют файлы синтаксиса Ruby в качестве
  стандарта в пакете среды выполнения. Для предыдущих версий файл синтаксиса для Ruby
  доступен на
  [http://www.xs4all.nl/~hipster/lib/ruby/ruby.vim](http://www.xs4all.nl/~hipster/lib/ruby/ruby.vim).
* [Jedit](http://jedit.sourceforge.net/): Портативный редактор, написанный на Java,
  поставляется с поддержкой Ruby.
* Barry Shultz написал файл определений Ruby для TextPad, доступный на
  [https://www.textpad.com/add-ons/synn2t.html](https://www.textpad.com/add-ons/synn2t.html).

### Как я могу аннотировать код на Ruby его результатами?

<div class="not-prose bg-ruby-100 dark:bg-ruby-800 rounded-lg p-8 my-6">
  <div class="flex items-start gap-3">
    <svg class="w-6 h-6 text-ruby-700 dark:text-ruby-200 flex-shrink-0 mt-0.5" fill="currentColor" viewBox="0 0 20 20">
      <path fill-rule="evenodd" d="M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495zM10 5a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 5zm0 9a1 1 0 100-2 1 1 0 000 2z" clip-rule="evenodd"/>
    </svg>
    <p class="text-sm text-ruby-700 dark:text-ruby-200 italic">
      This section or parts of it might be out-dated or in need of confirmation.
    </p>
  </div>
</div>


Люди часто аннотируют код на 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 даже после прочтения руководства!

<div class="not-prose bg-ruby-100 dark:bg-ruby-800 rounded-lg p-8 my-6">
  <div class="flex items-start gap-3">
    <svg class="w-6 h-6 text-ruby-700 dark:text-ruby-200 flex-shrink-0 mt-0.5" fill="currentColor" viewBox="0 0 20 20">
      <path fill-rule="evenodd" d="M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495zM10 5a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 5zm0 9a1 1 0 100-2 1 1 0 000 2z" clip-rule="evenodd"/>
    </svg>
    <p class="text-sm text-ruby-700 dark:text-ruby-200 italic">
      This section or parts of it might be out-dated or in need of confirmation.
    </p>
  </div>
</div>


Синтаксис Ruby был довольно стабильным начиная с Ruby 1.0, но время от времени
добавляются новые возможности. Поэтому книги и онлайн-документация могут устаревать.

Если у вас возникла проблема, не стесняйтесь задавать вопросы в списке рассылки
(смотрите страницу [Списки рассылки](/ru/community/mailing-lists/)).
Обычно вы получите своевременные ответы от Matz, автора языка,
от других гуру и от тех, кто уже решил
проблемы, похожие на вашу.

Пожалуйста, включайте вывод `ruby -v` вместе с любым проблемным
исходным кодом.

Если у вас возникла проблема с использованием [`irb`](../10/#irb),
имейте в виду, что у него есть некоторые ограничения.
Попробуйте запустить скрипт с помощью `irb --single-irb`, или напрямую используя
команду `ruby`.

В списке рассылки могут быть похожие вопросы, и хорошим
сетевым этикетом является чтение недавних писем (RFC1855:3.1.1, 3.1.2) перед тем, как задать вопрос.
Но обязательно спрашивайте в списке, и правильный ответ не заставит себя ждать.
