Почему Ruby — особенный язык

Юки­хи­ро Мацу­мо­то, автор Ruby, захо­тел создать совер­шен­ный объектно-ориентированный язык, что­бы в нём мак­си­маль­но пол­но рабо­тал ООП-подход. Кро­ме это­го, новый язык дол­жен соблю­дать свод пра­вил, кото­рых при­дер­жи­вал­ся сам Юки­хи­ро и кото­рые сей­час назы­ва­ют­ся «Путь Ruby». Вот неко­то­рые из них:

  1. Язык для чело­ве­ка, а не для ком­пью­те­ра — про­грам­ма долж­на читать­ся лег­ко даже при мини­маль­ном зна­нии Ruby, а всё осталь­ное берёт на себя компьютер.
  2. Про­сто, но не слиш­ком про­сто — всё долж­но быть про­стым в про­грам­ме, но толь­ко если для это­го не при­дёт­ся услож­нять что-то другое.
  3. Прин­цип наи­мень­шей неожи­дан­но­сти — все коман­ды и дей­ствия в Ruby долж­ны рабо­тать имен­но так, как от них ожи­да­ет про­грам­мист. Если он встре­ча­ет­ся с чем-то новым в язы­ке, то это не долж­но его уди­вить, а, наобо­рот, он вос­при­мет это как что-то естественное.
  4. «Не нуж­но с этим бороть­ся» — про­грам­ми­сту нуж­но исполь­зо­вать то, что есть в язы­ке, вме­сто того, что­бы пытать­ся под­стро­ить язык под себя.

Пер­вая вер­сия Ruby вышла в 1995 году, и за это вре­мя язык вырос от про­ек­та одно­го чело­ве­ка до боль­шо­го комью­ни­ти и 1,27 мил­ли­о­на строк кода. Сей­час Ruby — уни­вер­саль­ный крос­сплат­фор­мен­ный язык про­грам­ми­ро­ва­ния и под­дер­жи­ва­ет­ся все­ми совре­мен­ны­ми вер­си­я­ми Linux и MacOS.

Особенность языка

Пре­лесть и сила Ruby в том, что в нём вооб­ще всё — это объ­ект. Даже чис­ла, зна­че­ния пере­мен­ных и типы дан­ных — это тоже объ­ек­ты. Напри­мер, у вас есть сло­же­ние, кото­рое реа­ли­зу­ет­ся так:

x = 7 + 5

7 и 5 — чис­ла, за кото­рые отве­ча­ет класс Numeric, и этот класс зна­ет про знак сло­же­ния. Давай­те немно­го рас­ши­рим воз­мож­но­сти это­го класса:

class Numeric
  def plus(x)
    self + (x)
  end
end
y = 7.plus 5

С это­го момен­та у всех чисел появ­ля­ет­ся метод plus, кото­рый скла­ды­ва­ет это чис­ло со вто­рым. И таким же спо­со­бом мож­но рас­ши­рить свой­ства и воз­мож­но­сти каж­до­го эле­мен­та в про­грам­ме. Сде­лать авто­ма­ти­че­ский пере­вод из минут в секун­ды? Легко:

class Numeric
  def seconds
    self  * 60
  end
end
#теперь можем легко перевести 35 минут в секунды:
time = 35.seconds

И так мож­но делать с чем угод­но, без огра­ни­че­ний и несов­ме­сти­мо­сти типов. Да и какая может быть несов­ме­сти­мость, если типы — это тоже объ­ек­ты, кото­рые мож­но изме­нить. Это дела­ет Ruby похо­жим на C++, где есть пере­груз­ка опе­ра­то­ров и воз­мож­ность исполь­зо­вать коман­ды не так, как заду­ма­но изначально.

Синтаксис

На пер­вом месте в Ruby сто­ит чита­бель­ность и про­сто­та, поэто­му этот язык реаль­но осво­ить за неде­лю на базо­вом уровне.

Из замет­ных штук — не нуж­но ста­вить в кон­це каж­дой коман­ды точ­ку с запя­той и все вло­жен­но­сти обо­зна­ча­ют­ся про­бе­ла­ми, точ­но так же как в Python.

Ком­мен­та­рии. Пишем в нача­ле стро­ки знак решёт­ки #, и за ней — ком­мен­та­рий любой дли­ны. Ещё мож­но напи­сать ком­мен­та­рий в несколь­ко строк:

#Это простой однострочный комментарий
x = x + y
=begin
Это тоже комментарий, но в несколько строк.
Чтобы такое сделать, нужно в начале и конце комментария написать =begin и =end, каждый — в начале новой строки.
=end

При­сва­и­ва­ние и мате­ма­ти­че­ские опе­ра­то­ры. Тут всё про­сто: при­сва­и­ва­ние — это знак рав­но «=», а мате­ма­ти­че­ские опе­ра­то­ры такие же, как в жиз­ни — +, -, * и т. д.

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

Целые чис­ла: Fixnum (до 2³⁰) и Bignum. Вто­рой тип может хра­нить в себе целые чис­ла вооб­ще любо­го раз­ме­ра, если для них хва­тит места в опе­ра­тив­ной памяти.

Дроб­ные чис­ла: Float (чис­ло с пла­ва­ю­щей запя­той), Rational (раци­о­наль­ные чис­ла) и Complex (ком­плекс­ные чис­ла с мни­мой единицей).

Стро­ка: String, после­до­ва­тель­ность бай­тов в коди­ров­ке UTF-8, могут быть любой длины.

Сим­вол в Ruby — это не один какой-то сим­вол, а про­сто любая стро­ка, кото­рая оста­ёт­ся неиз­мен­ной. Что­бы ком­пью­тер понял, что это сим­вол, перед ним ста­вит­ся двое­то­чие: symbol = :это_тоже_символ.

Диа­па­зон — за него отве­ча­ет класс Range и в нём хра­нит­ся непре­рыв­ная после­до­ва­тель­ность целых чисел:

 d1 = 1..5   # Две точки — от 1 до 5 включительно.  d2 = 1...5  # Три точки — от 1 до 4, а 5 уже не входит в этот диапазон.

Услов­ный опе­ра­тор. Стан­дарт­ная фор­ма выгля­дит привычно:

if x > 0 then   puts "x - положительное число" #puts выводит значение на экран elsif x < 0 then   puts "x - отрицательное число"  else   puts "x - нуль" end

Но есть и несколь­ко дру­гих вари­ан­тов услов­но­го опе­ра­то­ра, напри­мер такой:

# Unless означает «Если условие не выполняется, то...» unless x > 3 then    puts x.to_s  # Выведет значение x, если оно НЕ больше трёх. else    puts "очень много, не сосчитать" end

Цик­лы. В Ruby семь видов цик­лов, пото­му что мож­но менять места­ми нача­ло цик­ла и усло­вия выхо­да из него, добав­лять счёт­чи­ки или опе­ра­тор при­ну­ди­тель­ной оста­нов­ки. Вот как выгля­дят клас­си­че­ские цик­лы со счёт­чи­ком, с пред­усло­ви­ем и с постусловием:

# Цикл for со счётчиком 
for i in 0 .. list.size-1 do
  print "#{list[i]} "
end
# Цикл с предусловием 
i=0
while i < list.size do
  print "#{ list [i]} "
  i += 1
end
# Цикл с постусловием
i = 0
begin
  print "#{list[i]} "
  i += 1
end until i == list.size

Клас­сы, объ­ек­ты и мето­ды. Так как Ruby пол­но­стью объектно-ориентированный язык, то в нём рабо­та­ет всё, что толь­ко есть в ООП:

  • пуб­лич­ные и при­ват­ные методы,
  • кон­струк­то­ры,
  • насле­до­ва­ние (с помо­щью встро­ен­ных примесей),
  • пере­опре­де­ле­ние класса,
  • и всё осталь­ное, что вам толь­ко пона­до­бит­ся сде­лать с объ­ек­та­ми или классами.

Для чего нужен Ruby

Так как Ruby — скрип­то­вый язык, то его мож­но при­ме­нять вооб­ще в любых сфе­рах раз­ра­бот­ки. Напри­мер, мож­но напи­сать пар­сер стра­ниц, кото­рый будет нахо­дить на сай­те интернет-магазина все кар­точ­ки това­ров и ска­чи­вать их назва­ние, цену и фото. Или мож­но сде­лать гене­ра­тор слож­ных паро­лей для всех посе­ти­те­лей сай­та, что­бы им не при­хо­ди­лось при­ду­мы­вать его самостоятельно.

Так­же на Ruby пишут мобиль­ные игры и при­ло­же­ния под Android и iOS, исполь­зуя Ruboto или RubyMotion.

Но луч­ше все­го Ruby рабо­та­ет в паре со сво­им зна­ме­ни­тым фрейм­вор­ком Ruby on Rails для созда­ния веб-приложений. Он поз­во­ля­ет быст­ро создать сайт со слож­ной струк­ту­рой, дина­ми­че­ски­ми стра­ни­ца­ми и при этом обой­тись без изу­че­ния SQL-запросов и рабо­ты с база­ми данных.

Ещё эту плат­фор­му любят в стар­та­пах, пото­му что на ней мож­но в корот­кие сро­ки раз­вер­нуть про­то­тип про­ек­та и сра­зу уви­деть его силь­ные и сла­бые стороны.

Что сделано на Ruby

Ruby исполь­зу­ют ком­па­нии раз­но­го уров­ня, в том чис­ле NASA, Motorola, Google или GitHub. Вот часть про­ек­тов, кото­рые напи­са­ны на Ruby или Ruby on Rails:

  • Twitter,
  • Kickstarter,
  • SoundCloud,
  • Redmine (систе­ма багтрекинга),
  • Inkscape (рабо­та с век­тор­ной графикой),
  • GitLab (управ­ле­ние репо­зи­то­ри­я­ми кода),
  • SketchUp (трёх­мер­ное моделирование),
  • Netflix (сери­а­лы),
  • Bloomberg (новост­ное агентство).

Если посмот­реть на этот спи­сок, то ста­но­вит­ся понят­но, что Ruby осо­бен­но хорош в веб-разработке и созда­нии сай­тов со слож­ной структурой.

С чего начать

Для стар­та вам даже не нуж­но ниче­го уста­нав­ли­вать на ком­пью­тер — исполь­зуй­те онлайн-интерпретатор onlinegdb или rextester.

Что­бы луч­ше разо­брать­ся в язы­ке или его воз­мож­но­стях, почи­тай­те руко­вод­ство «Ruby за 20 минут» на офи­ци­аль­ном сай­те Ruby. Един­ствен­ный момент — это машин­ный пере­вод ори­ги­наль­ной ста­тьи, как и всех осталь­ных рус­ско­языч­ных мате­ри­а­лов на этом сай­те. Поэто­му если зна­е­те англий­ский — луч­ше сра­зу читай­те на нём.

Если есть жела­ние дос­ко­наль­но разо­брать­ся в язы­ке, реко­мен­ду­ем кни­гу Хэла Фул­то­на «Про­грам­ми­ро­ва­ние на язы­ке Ruby» (The Ruby Way).