Ruby (язык программирования)

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 19:32, 8 июня 2016.
Ruby
fraimed
Парадигма мультипарадигма: динамический, объектно-ориентированный, рефлективный, императивный, функциональный
Спроектировано Юкихиро Мацумото
Печать дисциплины динамическая, утиная
OS кросс-платформенный
Лицензия лицензия Ruby, Лицензия BSD или GNU GPL v2
Портал: www.ruby-lang.org/
Главная реализация
Ruby MRI, YARV, Rubinius, MagLev, JRuby, MacRuby, RubyMotion, HotRuby, IronRuby, Mruby
Под влиянием
Ada, C++, CLU, Dylan, Eiffel, Lua, Lisp, Perl, Python, Smalltalk
Влияние
Clojure, D, Elixir, Falcon, Groovy, Ioke, Julia, Mirah, Nu, potion, Reia, Swift

Ruby (англ. ruby — рубин, произносится ['ru:bɪ] — ру́би) — интерпретируемый язык программирования высокого уровня. Обладает независимой от операционной системы реализацией многопоточности, строгой динамической типизацией, «сборщиком мусора» и многими другими возможностями, поддерживающими много разных парадигм программирования, прежде всего классово-объектную. Ruby был задуман в 1993 году (24 февраля) японцем Юкихиро Мацумото, стремившимся создать язык, совмещающий все качества других языков, способствующие облегчению труда программиста. По особенностям синтаксиса он близок к языкам Perl и Eiffel, по объектно-ориентированному подходу — к Smalltalk. Также некоторые черты языка взяты из Python, Lisp, Dylan и Клу. Кроссплатформенная реализация интерпретатора языка является полностью свободной.

Содержание

Возможности языка

  • Имеет лаконичный и простой синтаксис, разработанный под частичным влиянием Ада, Eiffel и Python.
  • Позволяет обрабатывать исключения.
  • Позволяет переопределять операторы, которые на самом деле являются методами.
  • Полностью объектно-ориентированный язык программирования. Все данные в Ruby являются объектами. Единственное исключение — управляющие конструкции, которые не являются объектами. Например, число «1» — это экземпляр класса Fixnum. Также поддерживается добавление методов в класс и даже в конкретный экземпляр во время выполнения программы.
  • Не поддерживает множественное наследование, но вместо него может использоваться концепция «примесей», основанная в данном языке на механизме модулей.
  • Содержит автоматический сборщик мусора. Он работает для всех объектов Ruby, в том числе для внешних библиотек.
  • Создавать расширения для Ruby на C очень просто частично из-за сборщика мусора, частично из-за несложного и удобного API.
  • Поддерживает замыкания с полной привязкой к переменным.
  • Поддерживает блоки кода (код заключается в { … } или do … end). Блоки могут использоваться в методах или преобразовываться в замыкания.
  • Целые переменные в Ruby автоматически конвертируются между типами Fixnum (32-разрядные) и Bignum (больше 32 разрядов) в зависимости от их значения, что позволяет производить целочисленные математические расчёты со сколь угодно большой точностью.
  • Не требует предварительного объявления переменных, но для интерпретатора желательно, чтобы переменным присваивалось пустое значение nil (тогда интерпретатор знает, что идентификатор обозначает переменную, а не имя метода).
  • В Ruby непосредственно в языке реализованы многие шаблоны проектирования, так, например, «одиночка» (singleton) может быть (хотя и не обязан) реализован добавлением необходимых методов к одному конкретному объекту (см. ниже).
  • Может динамически загружать расширения, если это позволяет операционная система.
  • Имеет независимую от ОС поддержку невытесняющей многопоточности.
  • Перенесён на множество платформ. Он разрабатывался на Linux, но работает на многих версиях Unix, DOS, Microsoft Windows (в частности, Win32), Mac OS, BeOS, OS/2 и т. д.

Философия языка

Юкихиро Мацумото, создателю языка Ruby принадлежат следующие высказывания: "Человек создан для творчества, и я всегда знал, что люблю творить. Увы, я обделён талантом художника или музыканта. Зато умею писать программы."

"Я хочу, чтобы компьютер был моим слугой, а не господином, поэтому я должен уметь быстро и эффективно объяснить ему, что делать."

Мацумото, фанат объектно-ориентированного программирования, мечтал о языке более мощном, чем Perl, и более объектно-ориентированном, чем Python. Основное назначение Ruby — создание простых и в то же время понятных программ, где важна не скорость работы программы, а малое время разработки, понятность и простота синтаксиса. Язык следует принципу «наименьшей неожиданности»: программа должна вести себя так, как ожидает программист. Однако в контексте Ruby это означает наименьшее удивление не при знакомстве с языком, а при его основательном изучении. Сам Мацумото утверждает, что целью разработки была минимизация неожиданностей при программировании для него, но после распространения языка он с удивлением узнал, что мышление программистов похоже, и для многих из них принцип «наименьшей неожиданности» совпал с его принципом.

Установка

Три способа установки Ruby

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

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

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

Сторонние инструменты

Многие руби-программисты используют сторонние инструменты для установки Ruby. Эти инструменты предоставляют различные преимущества, но не все из них официально поддерживаются. В любом случае их сообщество может оказать помощь.

RVM

Ruby Version Manager (RVM) – популярный инструмент для установки Ruby. Он позволяет устанавливать и управлять несколькими копиями Ruby в вашей системе, также как и несколькими альтернативными имплементациями Ruby.

RVM доступен для Mac OS X, Linux или любой другой UNIX-подобной операционной системы. Пользователи Windows могут обратить внимание на похожий проект pik или использовать RubyInstaller описанный в следующей секции.

RVM устанавливается следующей командой:

$ curl -L https://get.rvm.io | bash -s stable --ruby

Последние инструкции по установке RVM можно найти на странице установки RVM. Данная команда позволяет установить RVM и последнюю версию Ruby. При помощи RVM можно установить большинство имплементаций Ruby перечисленных ниже. Чтобы посмотреть все поддерживаемые версии, наберите rvm list known.

RubyInstaller

RubyInstaller – проект, помогающий установить Ruby на ОС Windows. Он предоставляет всё, что нужно для настройки полноценного окружения.

Чтобы воспользоваться RubyInstaller, скачайте его со . Далее лишь запустите установщик и все готово!

Если вы устанавливаете Ruby для того, чтобы воспользоваться Rails, вам пригодится RailsInstaller. Он использует RubyInstaller, но предоставляет вам дополнительные инструменты, которые помогут развернуть верное окружение для Rails.

Компиляция из исходного кода

Установка из исходного кода – способ для тех, кто хорошо знаком со своей платформой и кому, возможно, нужны специальные настройки для своего окружения. Это также хорошее решение в случае когда для вашей платформы нет готовых собранных пакетов.

Если у вас возникла сложность с компиляцией Ruby, попробуйте один из сторонних инструментов из следующей секции. Они могут помочь вам.

 sha256: b6eff568b48e0fda76e5a36333175df049b204e91217aa32a65153cc0cdcb761
  • Предыдущая стабильная: Ruby 2.1.8
 sha256: afd832b8d5ecb2e3e1477ec6a9408fdf9898ee73e4c5df17a2b2cb36bd1c355d
  • Старая стабильная (Из 2.0.0 серии): Ruby 2.0.0-p648
 sha256: 8690bd6b4949c333b3919755c4e48885dbfed6fd055fe9ef89930bde0d2376f8
  • Слепки:
    • Стабильный слепок: Это архив свежайшего стабильного слепка текущей стабильной ветки.
    • Nightly слепок: Это архив того что в SVN на данный момент. Может содержать баги и другие проблемы. Используйте на собственный риск.

Исходный код Ruby доступен по всему миру на нескольких зеркальных сайтах.

Системы управления пакетами

Если вы не можете скомпилировать ваш собственный Ruby и не хотите использовать сторонний инструмент для установки – вы можете воспользоваться пакетным менеджером вашей операционной системы.

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

Ruby на Linux

Debian GNU/Linux и Ubuntu используют систему управления пакетами apt. Вы можете использовать ее следующим образом:

$ sudo apt-get install ruby1.9.1

Да, данная команда установит Ruby 1.9.2 или новее. Это так называемая “совместимая версия библиотеки” для 1.9.1 судя по имени.

Arch Linux использует систему управления пакетами pacman. Чтобы получить Ruby, просто напишите следующее:

$ sudo pacman -S ruby

На других системах вы можете поискать в репозитории пакетного менеджера вашего дистрибутива. Хотя возможно, верным выбором будет использование RVM.

Ruby на Mac OS X

Ruby 1.8.7 полностью поддерживается в Mac OS X Lion так же, как и многие популярные гемы. За подробностями смотрите вики Ruby на Mac OS Forge.

Mac OS X Tiger поставляется с Ruby версии 1.8.2 и Leopard поставляется с 1.8.6. Но для тех, кто еще не обновился до Leopard, существует множество способов установить последнюю версию Ruby.

Многие люди на Mac OS X используют Homebrew как пакетный менеджер. И это действительно просто – установить Ruby:

$ brew install ruby

А также, так как OS X является UNIX-подобной ОС, скачивание и установка из исходного кода настолько же эффективна, как и другие решения. Чтобы помочь вам с установкой новой версии Ruby на OS X, наилучшей идеей будет воспользоваться RVM. Наберите rvm notes, чтобы получить специфичную информацию для вашей операционной системы.

Подробные инструкции по установке Ruby (и Rails) написал Dan Benjamin: для Tiger, для Leopard, и для Snow Leopard. Данные инструкции помогут вам запустить окружение очень быстро. Для Lion поможет данная инструкция.

Ruby на Solaris и OpenIndiana

Ruby 1.8.7 доступен для Solaris 8-10 на Sunfreeware и Blastwave. Ruby 1.9.2p0 доступен также на Sunfreeware, но это все уже устарело. Использование RVM поможет вам получить последнюю версию Ruby.

Чтобы установить Ruby на OpenIndiana, пожалуйста, используйте клиент Image Packaging System, или IPS. Данная система установит последние бинарные файлы Ruby и RubyGems прямо из сетевого репозитория OpenSolaris для Ruby 1.9. Это просто:

$ pkg install runtime/ruby-18

Как и прежде, RVM, это хороший способ получить последнюю версию Ruby.

Синтаксис и Семантика

Всё объект

 2.class
=> Fixnum

 2.to_s
=> "2"

 2.to_s.class
=> String

У всего есть значение

 2 + 2
=> 4

 (2+2).zero?
=> false

 if true then "yes" end
=> "yes"

 if false then "yes" end
=> nil

Вывод vs. Значение

 puts "foo"
 foo
=> nil

Вывод – foo\n, но при этом значение – nil.

Печать

  • print печатает передаваемые аргументы
  • puts печатает передаваемые аргументы с переводом на новую строку в конце
  • p inspects and prints its arg plus a newline

Продвинутая печать

  • pp "красивая" печать параметров с переводом на новую строку
  • require "pp"
  • d еще более "красивая" печать, чем pp
  • предоставляется gem'ом wrong
  • require "wrong"; include Wrong::D
  • если x = 10, d { x } печатает x is 10

Блоки как мини-функции

  • Блоки также могут принимать параметры и возвращать значения
  • к примеру, итератор map переносит каждый элемент массива в новый массив

     ["hello", "world"].map { |string| string.upcase }
    => ["HELLO", "WORLD"]
    
  • { |string| string.upcase } определяет блок

Опциональная пунктуация

  • Точки с запятой, скобки, и return являются опциональными

  • Следующие выражения эквивалентны:

    def inc(x)
      return x + 1;
    end
    
    def inc x
      x + 1
    end
    
    def inc(x); x + 1; end
    
    def inc(x) x + 1; end
    

Переносы строк

x = 1 + 2
x #=> 3

x = 1
  + 2
x #=> 1

Решение: всегда оставлять операторы на верхней строке

x = 1 +
    2
x #=> 3

Используйте круглые скобки только если они нужны

 "Hello".gsub "H", "h"
=> "hello"

 "Hello".gsub "H", "h".reverse
=> "hello"

 "Hello".gsub("H", "h").reverse
=> "olleh"

Комментирование символом решётки

# комментарий
2 + 2 # комментарий

Переменные и неявное объявление

first_name = "Ded"
last_name = "Moroz"
full_name = first_name + last_name
#=> "DedMoroz"

Встроенные типы

  • Numbers
  • 42 (Fixnum)
  • 3.14159 (Float)
  • Booleans
  • true
  • false
  • Strings
  • "apple"
  • 'banana'
  • Symbols
  • :apple
  • Regular Exsource lang="ruby"ssions
  • /fo*/i
  • Arrays
  • ["apple", "banana"]
  • Ranges
  • (1..10)
  • Hashes
  • {:apple => 'red', :banana => 'yellow'}
  • {apple: 'red', banana: 'yellow'}

Интерполяция строк

"boyz #{1 + 1} men"
=> "boyz 2 men"
  • Любой Ruby-код может быть написан внутри фигурных скобок
  • Он выполняется и результат записывается в строке

равно, двойное равно, и тройное равно

  • x = 1 означает “передать значение 1 переменной x
  • x == 2 означает “true если x равно 2, иначе false
  • x === 3 означает то же, что и == но иногда большее

Функции

def add a, b
  a + b
end

add 2, 2
#=> 4
  • Заметьте, ‘return’ не необходим
  • def add(a, b) также разрешено

Классы и методы

class Calculator
  def add(a,b)
    a + b
  end
end

calc = Calculator.new
calc.add(2, 2)
#=> 4
  • функция внутри класса называется методом

Классы

  • Класс определяет группу методов
  • Каждый объект имеет класс, если класс не задан явно, то объект принадлежит классу Object

Сообщения и методы

  • на объект ссылаются через переменную или литерал
  • оператор "точка" (.) отсылает сообщение объекту
  • объект принимает сообщение и вызывает метод
  • если точка не написано, то сообщение принимает объект по умолчанию (self)

Цепочки методов

  • Цепочки методов – удобная и мощная особенность Ruby
  • Она зависит от трех возможностей языка:
    • У каждого выражения есть значеие
    • Каждое значение является объектом
    • Итераторы – циклы внутри методов
  • Таким образом, методы можно вызывать для всего, в том числе для результата итератора

Пример

Дана строка:

s = "my dog is sick"

Без применения цепочки методов:

words = s.split
words = words.map{ |word| word.capitalize }
s = words.join(" ")

С применением:

s = "my dog has is sick"
s.split.map{ |word| word.capitalize }.join(" ")

Методы с восклицательным и вопросительным знаками

  • имена методов могут заканчиваться на ! или ?
  • ? значит, что объект вернет boolean-значение
  • ! означает предостережение, метод, скорее всего, изменяет объект, для которого он вызывается

Идентификаторы

  • локальная_перменная - начинается со строчной буквы или символа нижнего подчеркивания, содержит строчные буквы, цифры, подчеркивания, стиль snake_case
  • @instance_переменная - начинается с @
  • @@переменная_класса - начинается с @@
  • $глобальная_переменная - начинается с$
  • Константа или КОНСТАНТА - должна начинаться с заглавной буквы
  • ClassName - при помощи стиля CamelCase
  • имя_метода? - как локальная пермененная, но может оканчиваться на ? или ! или =
  • ключевые слова - окола 40 зарезервированных слов типа (def) или (__FILE__)
  • литералы - "hi" для сторк, [1,2] для массивов, {:a=>1, :b=>2} для хэшей и т. д.

Видимость переменных

var   # локальная переменная (или вызов метода)
@var  # instance переменная
@@var # переменная класса
$var  # глобальная переменная
VAR   # константа

load и require

  • load вставляет содержимое запрашиваемого файла в текущий
  • require делает методы запрашиваемого файла доступными в текущем
    • игнорирует уже загруженные файлы
    • опускает окончаение .rb
    • также может быть использован для расширений, написанных на языке C (.so, .dll, и т. п.)

Другие имплементации Ruby

Ruby как язык имеет несколько разных имплементаций. Данная статья посвящена оригинальной имплементации MRI (“Matz’s Ruby Interpreter” – Ruby интерпретатор Матца) или CRuby, но также существует несколько других. Они бывают очень полезны в различных ситуациях, предоставляют большую интеграцию с другими языками или окружениями, или имеют возможности, которых нет в MRI.

Список имплементаций

  • JRuby это Ruby реализованный на JVM (Java Virtual Machine), использует оптимизированный JIT компилятор, сборщик мусора, нативные потоки, инструментальную экосистему и огромное количество библиотек JVM.
  • Rubinius это “Ruby написанный на Ruby”. Реализован на основе LLVM – изящной виртуальной машине, на который созданы и другие известные языки.
  • MacRuby это Ruby, который тесно интегрирован с библиотеками Cocoa от Apple для Mac OS X. Позволяет вам проще писать приложения для Mac OS X.
  • mruby это легковесная реализация Ruby, которая может быть слинкована и встроена в приложение. Возглавляет разработку mruby создатель языка Ruby, Yukihiro “Matz” Matsumoto.
  • IronRuby это имплементация “тесно интегрированная с .NET Framework”.
  • MagLev это “быстрая, стабильная имплементация Ruby с интегрированным постоянством объектов и распределенным открытым кешем”.
  • Cardinal это “компилятор Ruby для виртуальной машины Parrot” (Perl 6).

Некоторые из этих имплементаций, включая MRI, следуют инструкциям от RubySpec, “полной выполняемой спецификации для языка программирования Ruby”.

Книги по теме

  • Beginning Ruby: From Novice to Professional от Peter Cooper
  • The Well-Grounded Rubyist от David A. Black
  • Eloquent Ruby от Russ Olsen
  • Ruby Under a Microscope от Pat Shaughnessy
  • The Pragmatic Programmers' Guide от Dave Thomas
  • Ruby on Rails Tutorial от Michael Hartl

Ссылки

Язык программирования Ruby
RubyMonk – интерактивные курсы по Ruby на английском
Сравнение языков программирования