ruby — вопросы с ответами

Ruby – это объектно-ориентированный язык программирования, изначально разработанный в качестве замены Perl. Юкихиро Мацумото (также известный, как Matz») спроектировал и создал Ruby в Японии.

Хотя Ruby является объектно-ориентированным, он также поддерживает парадигмы функционального и императивного программирования. В отличие от C или Java, которые реализуют статическую типизацию, Ruby является динамически типизированным языком. Таким образом, Ruby похож на Python и Lisp. Ruby создавался для обеспечения продуктивности и простоты. Юзабилити и дизайну интерфейса часто отдают предпочтение скорости или параллелизму.

Так же Ruby следует "правилу наименьшего удивления", цель которого сводить к минимуму путаницу как для новых, так и для опытных пользователей. Этот принцип поощряет последовательность, общие шаблоны проектирования и повторно используемый код.

Производительность

Люди иногда отвергают Ruby, потому что он работает слишком медленно. И хотя это отчасти правда, большому количеству разработчиков на это плевать. Самые проблемные места с производительностью, которые у вас будут возникать изо дня в день, – это база данных, файловая система, интернет и ошибки. Это явно не проблемы самого Ruby, поэтому и его ускорение будет иметь незначительный эффект.

Если бы нам нужно было написать приложение для матричного преобразования, то мы бы сделали это на C, потому что такое приложение будет очень требовательным к производительности. Тем не менее, если бы мы писали веб-приложение, которое нуждалось в матричном преобразователе, мы написали его на Ruby, вызывая библиотеку C. Просто потому, что код Ruby гораздо более увлекательный и продуктивный.

Кроме того, оборудование дешевое, а разработчики нет. Если можно использовать язык программирования, такой как Ruby, который сделает программистов более продуктивными, то вы сможете повысить производительность своего кода с помощью более качественного оборудования. Вы сможете купить лучшее оборудование за сэкономленные деньги, сделав свою команду более продуктивной.

Синтаксис Ruby с примерами

Давайте рассмотрим основы синтаксиса Ruby на реальных примерах.

Ruby предоставляет встроенный механизм для проверки того, что файл содержит допустимый синтаксис Ruby. Вы можете проверить синтаксис файла, передав флаг -c и путь к файлу интерпретатору Ruby.

$ ruby -c /path/to/ruby/file

В ответ вы получите "Syntax OK", если он правильный. В противном случае будет напечатана трассировка стека, указывающая на строку, где произошла ошибка.

Комментарии

В Ruby хеш-символ (#) используется для представления комментария. Комментарии содержат документацию для вашего кода. Все, что после # в той же строке, рассматривается как комментарий, предназначенный для чтения людьми и игнорируемый интерпретатором Ruby:

variable = 2 # Это комментарий
# Это многострочный комментарий, потому что каждая
# строка начинается с символа хеша

Очень важно документировать, почему вы пишете код. Используйте комментарии, чтобы объяснить, почему вы решили реализовать свой код так, как вы это сделали, и описать альтернативные подходы, которые вы рассмотрели. Джефф Этвуд, известный в Stack Exchange и Discourse, блестяще объясняет цель комментариев следующим образом: «Код говорит вам как, комментарии говорят почему».

Например, рассмотрим следующий фрагмент кода Ruby, который покупает бекон, если в настоящее время его меньше пяти кусочков. Читая код, вы можете понять, что делает код, но не ясно, почему код был написан в первую очередь:

if bacon.strips < 5
buy_bacon
end

В следующем коде добавлен простой комментарий, объясняющий, почему мы должны покупать больше бекона, когда их меньше пяти. Полезно понять контекст этой покупки: Джейку нравится есть пять кусков бекона по утрам, поэтому мы хотим всегда иметь под рукой достаточное количество кусочков:

# Джейк ест 5 кусочков бекона каждое утро
if bacon.strips < 5
buy_bacon
end

Переменные

Как мы только что видели в предыдущем примере, переменные в Ruby назначаются слева направо:

variable = 2 # Это присваивает значение 2 переменной

Поскольку Ruby не является статически типизированным языком, вам не нужно объявлять тип переменной при его назначении. В следующих примерах переменным присваиваются очень разные значения: число, строка hello и даже объект. Нет необходимости указывать Ruby тип содержимого, которое будет храниться в переменной, перед присвоением значений:

В Ruby переменная доступна в самой внешней области ее объявления. Рассмотрим следующий пример, который лучше демонстрирует переменную область видимости. Сначала объявляется переменная верхнего уровня с именем bacon_type и ей присваивается значение crispy. Затем бекон готовится дважды, и дополнительной переменной с именем температура присваивается значение 300. Наконец, скрипт пытается получить доступ к переменной температуры, которая теперь выходит за рамки:

  1. Переменная bacon_type объявлена в области видимости верхнего уровня, поэтому она будет доступна везде в этом контексте.
  2. Мы можем получить доступ к переменной bacon_type внутри более конкретной области видимости, такой как цикл.
  3. Переменная, объявленная внутри области видимости, доступна только внутри этой области.
  4. Вне рамок объявления попытка доступа к переменной приведет к исключению (неопределенная локальная переменная или метод «температура»).

Математические операции

В Ruby представлены основные арифметические операции, такие как сложение, умножение и деление, в качестве основной функции языка:

Допустим, чтобы обеспечить продуктивную и дружелюбную рабочую среду, политика вашей компании требует, чтобы ваша команда делала перерыв на бекон каждые три часа. Несмотря на строгую политику, команда часто увлекается своей работой и забывает проверять время. Вы могли бы написать короткий скрипт на Ruby, который предупреждает команду, когда она должна остановиться и насладиться свежеприготовленным беконом:

Более сложные операции, такие как округление или полиномиальное распределение, представлены в модуле Math Ruby. Вы можете использовать метод Math.hypot в скрипте Ruby, чтобы вычислить длину диагонали для прямоугольного треугольника, возвращая сумму квадратов двух его сторон:

Math.hypot(43, 57)

Дополнительные функции и константы, такие как log, sin, sqrt, e и π, также содержатся в модуле Math.

Строки

Существует два распространенных способа создания строк в Ruby: с одинарными и двойными кавычками. Строки в одинарных кавычках имеют преимущество в виде одного нажатия клавиши и не применяют интерполяцию.

Строки в двойных кавычках полезны, когда переменные должны оцениваться как часть содержимого строки – этот процесс оценки известен как интерполяция строк. Символ хеша используется в качестве заполнителя в строке в двойных кавычках, чтобы указать Ruby, что заполнитель должен быть заменен оцененным содержимым переменной. В следующем примере #{x} используется для вставки значения x в строку.

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

  1. Строки в двойных кавычках интерполируются.
  2. Строки в одинарных кавычках используют литерал.

Вам может будет нужно отображать специальные символы. Например, при сохранении имени игрока Джима О'Рурка в виде строки вам необходимо экранировать одинарную кавычку в его фамилии:

В качестве альтернативы, вы можете использовать двойные кавычки и избежать экранирования вообще:

Массивы

Поддержка нативных массивов в Ruby позволяет создавать списки элементов. Массивы Ruby используют обозначение в скобках, как показано в следующем примере. Массивы индексируются нулем, и интерпретатор Ruby автоматически выделяет память при добавлении новых элементов; не нужно беспокоиться о динамическом изменении размеров массивов:

  1. Метод length сообщает нам, сколько элементов в массиве.
  2. Иногда вы увидите размер, используемый как синоним длины; Ruby предлагает на выбор использование обоих.
  3. Добавьте один или несколько элементов в конец массива с помощью push.
  4. Это полезный псевдоним для push, когда вы хотите добавить только один элемент в конец.
  5. Массивы индексируются нулем, поэтому мы можем получить доступ к первому элементу, используя 0 в качестве индекса.
  6. Первый элемент также доступен через удобный первый метод.
  7. Чтобы дополнить первый метод, Ruby также предоставляет последний метод.
  8. Указание диапазона в скобках приведет к разрезу массива от первого индекса до второго индекса включительно.

Например, вы можете использовать массивы Ruby для хранения упорядоченного списка всех сотрудников в том порядке, в котором они были наняты. Каждый раз, когда новый сотрудник присоединяется к команде, он добавляется в список. Первый сотрудник имеет индекс 0, второй сотрудник – индекс 1 и т. д.

Когда новый сотрудник присоединяется к команде, его имя помещается в конец массива:

Хэши

Ruby также поддерживает хеши (иногда называемые словарями или картами на других языках). Хэши – это пары ключ-значение, которые ведут себя аналогично массивам. Хэши создаются с использованием буквенных фигурных скобок ({}):

  1. Доступ к отдельным элементам осуществляется через скобки, как и в массивах.
  2. Те же обозначения в скобках можно использовать для установки элементов на определенный ключ.
  3. Хэши отвечают на полезные методы, такие как ключи и значения.

Например, вы можете использовать хэши Ruby для хранения информации о популярных футболистах и их текущей статистике. Ключ в этом хеше будет именем футболиста. Значением будет другой хеш, ключом которого является название статистики, а значением – номер этой статистики. Это наглядно иллюстрируется следующими примерами данных:

Доступ к отдельному игроку осуществляется с использованием его имени в качестве ключа в хеше игроков.

Регулярные выражения

Ruby поддерживает регулярные выражения в стиле Perl, используя оператор =~:

Например, вы можете попробовать использовать регулярные выражения, чтобы найти имена в списке игроков футбольной команды, начиная с определенной буквы алфавита. Регулярные выражения могут быть привязаны с помощью символа (^), который начинает сравнение в начале строки. Следующий фрагмент кода ищет всех игроков с фамилией, начинающейся на букву F:

4 ответа
Сообщение об ошибке: Building native extensions. This could take a while... ERROR: Error installing rails: ERROR: Failed to build gem native extension. /usr/bin/ruby2.1 -r ./siteconf20150328-1540-hff2f0.rb extconf.rb checking if the C compiler accepts ... *** extconf.rb failed *** Could not...
28 март 2015, в 13:05
5 ответов
Я не знаю, как установить последнюю версию Ruby на Ubuntu. Сначала я установил по умолчанию Ruby 1.9.3, используя sudo apt-get install ruby Затем я попытался установить версию 2.0 с помощью sudo apt-get install ruby2.0 Моя версия Ruby по-прежнему "ruby 1.9.3p484 (версия 2013-11-22 версия 43786) [x...
ubuntu-14.04
27 окт. 2014, в 20:19
8 ответов
Я успешно установил rvm, но когда я запускаю следующие команды sudo apt-get update Или: rvm install 2.0.0 У меня есть следующие ошибки: W: Failed to fetch http://ppa.launchpad.net/cheleb/blender-svn/ubuntu/dists/precise/main/source/Sources 404 Not Found W: Failed to fetch http://ppa.launchpad.n...
25 апр. 2013, в 18:38
3 ответа
В настоящее время у меня Ruby on Rails, установленный через RVM в Ubuntu 12.04. База данных по умолчанию настроена в SQLite3, но я хотел бы перейти на PostgreSQL для целей нажатия на Heroku. Как я могу это сделать?
18 июнь 2012, в 23:58
5 ответов
Мне нужно изменить тип столбца с даты на дату-время для приложения, которое я создаю. Мне все равно, что данные все еще разрабатываются. Как я могу это сделать?
migration
ruby-on-rails-3
04 март 2011, в 06:37
4 ответа
Каковы альтернативы Wordpress для Ruby on Rails? Как они сравниваются с Wordpress?
content-management-system
07 янв. 2011, в 16:36
15 ответов
Я использую Fedora 14, и у меня установлен и запущен MySQL и MySQL сервер 5.1.42. Теперь я попытался сделать это как пользователь root: gem install mysql Но я получаю эту ошибку: Building native extensions. This could take a while... ERROR: Error installing mysql: ERROR: Failed to build gem n...
rubygems
29 нояб. 2010, в 14:38
12 ответов
Я пытаюсь настроить RMagick на Ubuntu 10.04. Посмотрел here, но не имел радости. Я даже скомпилировал и установил ImageMagick из источника, но инструкции здесь все равно не помогли мне, когда я пытаюсь установить RMagick с помощью RubyGems. Я получил эту ошибку: carcher@carcher-laptop:~/Code/temp/RM...
imagemagick
rmagick
14 сен. 2010, в 00:07
23 ответа
У меня возникают проблемы при установке mysql2 gem для Rails. Когда я пытаюсь установить его, запустив bundle install или gem install mysql2, он вызывает следующую ошибку: Ошибка при установке mysql2: ERROR: Не удалось создать собственное расширение gem. Как я могу исправить это и успешно установи...
31 авг. 2010, в 11:14
17 ответов
У меня есть ошибка при установке sqlite3-ruby: Building native extensions. This could take a while... ERROR: Error installing sqlite3-ruby: ERROR: Failed to build gem native extension. /usr/bin/ruby1.8 extconf.rb checking for sqlite3.h... no sqlite3.h is missing. Try 'port install sqlite3 +u...
sqlite3
sqlite3-ruby
11 авг. 2010, в 12:54
5 ответов
Есть ли способ на Ubuntu 9.04 установить Ruby 1.8 как ruby1.8 (или вообще избавиться от него) и иметь Ruby 1.9 по умолчанию ruby?
ruby-1.9
12 дек. 2009, в 10:09
8 ответов
Мне интересно установить последнюю версию Ruby на Ubuntu 9.04. Теперь я могу отлично работать с тегами ./configure и make, но о чем мне интересно: как избежать конфликтов с системой упаковки? Например, если какой-либо другой пакет, который я устанавливаю, зависит от Ruby, не будет ли диспетчер пакет...
package-managers
ubuntu-9.04
10 июль 2009, в 14:58
5 ответов
Недавно я обновился до Ubuntu 9.04, и у меня есть проблемы с использованием драгоценных камней. Я установил Ruby, Rubygems и Rails, используя apt-get. Команда rails работает. Затем я установил capistrano и другие драгоценные камни, такие как heroku. Для этого я использовал команду: sudo gem install ...
rubygems
capistrano
26 май 2009, в 10:15
12 ответов
Я пытаюсь установить драгоценный камень SQLite на коробке Fedora 9 Linux с Ruby 1.8.6, Rails 2.2.2, gem 1.3 и sqlite-3.5.9. Вот команда, которую я запускаю, и ее результаты: sudo gem install sqlite3-ruby Building native extensions. This could take a while... ERROR: Error installing sqlite3-ruby: ...
07 янв. 2009, в 17:12
16 ответов
Запуск сайта rails прямо сейчас с помощью SQLite3. Примерно каждые 500 запросов или около того я получаю ActiveRecord:: StatementInvalid (SQLite3:: BusyException: база данных заблокирована:... Какой способ исправить это, что будет минимально инвазивным для моего кода? Я использую SQLLite на данный м...
17 сен. 2008, в 00:42
Наверх
Меню