Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

Рубин является интерпретированы , высокого уровня , общего назначения , язык программирования . Он был разработан и разработан в середине 1990-х Юкихиро «Мац» Мацумото в Японии .

Ruby динамически типизирован и использует сборку мусора . Он поддерживает несколько парадигм программирования , включая процедурное , объектно-ориентированное и функциональное программирование . По словам создателя, на Ruby повлияли Perl , Smalltalk , Eiffel , Ada , BASIC и Lisp . [14] [15]

История [ править ]

Ранняя концепция [ править ]

Мацумото сказал, что Ruby был задуман в 1993 году. В сообщении 1999 года в списке рассылки ruby-talk он описывает некоторые из своих ранних идей о языке: [16]

Я говорил со своим коллегой о возможности объектно-ориентированного языка сценариев. Я знал Perl (Perl4, а не Perl5), но мне он не очень нравился, потому что от него пахло игрушечным языком (он все еще есть). Объектно-ориентированный язык казался очень многообещающим. Тогда я знал Python . Но мне это не понравилось, потому что я не думал, что это действительно объектно-ориентированный язык - объектно-ориентированные функции казались дополнением к языку. Как языковой маньяк и фанат объектно-ориентированного программирования в течение 15 лет, я действительно хотел получить настоящий объектно-ориентированный, простой в использовании язык сценариев. Я искал, но не нашел. Я решил это сделать.

Мацумото описывает дизайн Ruby как простой язык Lisp по своей сути, с объектной системой, подобной системе Smalltalk, блоками, вдохновленными функциями высшего порядка , и практической полезностью, такой как Perl. [17]

Имя «Рубин» [ править ]

Название «Рубин» возникло во время сеанса онлайн-чата между Мацумото и Кейджу Ишицука 24 февраля 1993 года, до того, как для языка был написан какой-либо код. [18] Изначально было предложено два названия: « Коралл » и « Рубин ». Мацумото выбрал последнее в более позднем электронном письме Ишицуке. [19] Позже Мацумото отметил фактор при выборе названия «Рубин» - это камень, из которого родился один из его коллег. [20] [21]

Первая публикация [ править ]

О первом публичном выпуске Ruby 0.95 было объявлено в японских группах новостей 21 декабря 1995 года. [22] [23] Впоследствии за два дня были выпущены еще три версии Ruby. [18] Релиз совпал с запуском списка рассылки ruby-list на японском языке , который был первым списком рассылки для нового языка.

На этом этапе разработки уже присутствовали многие функции, знакомые в более поздних выпусках Ruby, включая объектно-ориентированный дизайн, классы с наследованием, миксины , итераторы , замыкания , обработку исключений и сборку мусора . [24]

Ранние выпуски [ править ]

После выпуска Ruby 0.95 в 1995 году в последующие годы было выпущено несколько стабильных версий Ruby:

  • Ruby 1.0: 25 декабря 1996 г. [18]
  • Ruby 1.2: декабрь 1998 г.
  • Ruby 1.4: август 1999 г.
  • Ruby 1.6: сентябрь 2000 г.

В 1997 году в сети была опубликована первая статья о Ruby. В том же году Мацумото был нанят netlab.jp для работы над Ruby в качестве штатного разработчика. [18]

В 1998 году Мацумото запустил Архив приложений Ruby вместе с простой англоязычной домашней страницей для Ruby. [18]

В 1999 году начался первый англоязычный список рассылки ruby-talk , что свидетельствовало о растущем интересе к языку за пределами Японии. [25] В этом же году Мацумото и Кейджу Ишицука написали первую книгу по Ruby, объектно-ориентированный язык сценариев Ruby (オ ブ ジ ェ ク ト 指向 ス Ruby), которая была опубликована в Японии в октябре 1999 года. 2000-е издало около 20 книг по Ruby на японском языке. [18]

К 2000 году Ruby был более популярен в Японии, чем Python. [26] В сентябре 2000 года была напечатана первая англоязычная книга Programming Ruby , которая позже была бесплатно выпущена для широкой публики, что еще больше расширило распространение Ruby среди англоговорящих. В начале 2002 года англоязычный список рассылки ruby-talk получал больше сообщений, чем японский ruby-list , демонстрируя растущую популярность Ruby в мире, не говорящем по-японски.

Ruby 1.8 [ править ]

Ruby 1.8 изначально был выпущен в августе 2003 г., долгое время оставался стабильным и был исключен в июне 2013 г. [27] Несмотря на то, что он объявлен устаревшим, все еще существует код, основанный на нем. Ruby 1.8 только частично совместим с Ruby 1.9.

Ruby 1.8 был предметом нескольких отраслевых стандартов. Языковые спецификации для Ruby были разработаны Центром продвижения открытых стандартов Агентства по продвижению информационных технологий ( японское правительственное агентство) для представления в Японский комитет по промышленным стандартам (JISC), а затем в Международную организацию по стандартизации (ISO). Он был принят в качестве промышленного стандарта Японии (JIS X 3017) в 2011 году [28] и международного стандарта ( ISO / IEC 30170 ) в 2012 году. [29] [30]

Примерно в 2005 году интерес к языку Ruby резко возрос вместе с Ruby on Rails , веб-фреймворком, написанным на Ruby. Rails часто приписывают повышение осведомленности о Ruby. [31]

Ruby 1.9 [ править ]

Ruby 1.9 был выпущен на Рождество в 2007 году. Начиная с Ruby 1.9.3, выпущенного 31 октября 2011 года [32], Ruby перешел с двойной лицензии по Ruby License и GPL на двойную лицензию по Ruby License и лицензия BSD с двумя пунктами. [33] Принятие 1.9 замедлилось из-за изменений с 1.8, которые потребовали переписывания многих популярных сторонних гемов .

Ruby 1.9 содержит много существенных изменений по сравнению с версией 1.8. [34] Примеры:

  • локальные переменные блока (переменные, которые являются локальными для блока, в котором они объявлены)
  • дополнительный синтаксис лямбда :f = ->(a,b) { puts a + b }
  • дополнительный синтаксис литерала Hash с использованием двоеточий для символьных ключей:{symbol_key: "value"} == {:symbol_key => "value"}
  • поддерживаются построчные кодировки символов
  • новый API сокетов ( поддержка IPv6 )
  • require_relative безопасность импорта

Ruby 1.9 устарел с 23 февраля 2015 г. [35], и он больше не будет получать исправления ошибок и безопасности. Пользователям рекомендуется перейти на более новую версию.

Ruby 2.0 [ править ]

Ruby 2.0 добавил несколько новых функций, в том числе:

  • аргументы ключевого слова метода,
  • новый метод Module#prependдля расширения класса,
  • новый литерал для создания массива символов,
  • новый API для ленивого вычисления Enumerables и
  • новое соглашение об использовании #to_h для преобразования объектов в хэши. [36]

Ruby 2.0 должен был быть полностью обратно совместим с Ruby 1.9.3. На момент официального выпуска 2.0.0 от 24 февраля 2013 года было всего пять известных (незначительных) несовместимостей. [37]

Ruby 2.0 устарел с 24 февраля 2016 г. [38], и он больше не будет получать исправления ошибок и безопасности. Пользователям рекомендуется перейти на более новую версию.

Ruby 2.1 [ править ]

Ruby 2.1.0 был выпущен на Рождество в 2013 году. [39] Релиз включает в себя ускорения, исправления ошибок и обновления библиотек.

Начиная с версии 2.1.0, политика управления версиями Ruby больше похожа на семантическую . [40] Хотя политика управления версиями Ruby похожа, она несовместима с семантической версией:

Семантическое управление версиями также предоставляет дополнительные метки для метаданных предварительной версии, а метаданные сборки доступны как расширения для формата MAJOR.MINOR.PATCH, недоступные в Ruby.

Ruby 2.1 устарел с 1 апреля 2017 г. [41], и он больше не будет получать исправления ошибок и безопасности. Пользователям рекомендуется перейти на более новую версию.

Ruby 2.2 [ править ]

Ruby 2.2.0 был выпущен на Рождество в 2014 году. [42] Релиз включает в себя ускорения, исправления ошибок и обновления библиотек, а также удаляет некоторые устаревшие API. В частности, Ruby 2.2.0 вводит изменения в обработку памяти - инкрементный сборщик мусора, поддержку сборки мусора символов и возможность компиляции непосредственно с jemalloc. Он также содержит экспериментальную поддержку использования vfork (2) с system () и spawn (), а также добавленную поддержку спецификации Unicode 7.0.

Функции, которые были устаревшими или удалены, включают callcc, библиотеку DL, Digest :: HMAC, lib /rational.rb, lib / complex.rb, GServer, Logger :: Application, а также различные функции C API. [43]

Ruby 2.2 устарел с 1 апреля 2018 г. [44] и больше не будет получать исправления ошибок и безопасности. Пользователям рекомендуется перейти на более новую версию.

Производительность PowerPC64
Начиная с версии 2.2.1, [45] производительность Ruby MRI на PowerPC64 была улучшена. [46] [47] [48]

Ruby 2.3 [ править ]

Ruby 2.3.0 был выпущен на Рождество в 2015 году. Несколько заметных изменений включают:

  • Возможность помечать все строковые литералы как замороженные по умолчанию, что значительно увеличивает производительность строковых операций. [49]
  • Сравнение хэшей для прямой проверки пар ключ / значение, а не только ключей.
  • Новый оператор безопасной навигации, &. который может упростить обработку nil (например, вместо , мы можем использовать ).if obj && obj.foo && obj.foo.barif obj&.foo&.bar
  • Did_you_mean камень теперь в комплекте по умолчанию , и требуется при запуске , чтобы автоматически предлагать подобные имя матчи на более NameError или NoMethodError .
  • Hash # dig и Array # dig для легкого извлечения глубоко вложенных значений (например, заданное значение Foo Baz теперь может быть извлечено ).profile = { social: { wikipedia: { name: 'Foo Baz' } } }profile.dig(:social, :wikipedia, :name)
  • .grep_v(regexp) который будет соответствовать всем отрицательным примерам данного регулярного выражения в дополнение к другим новым функциям.

Ветвь 2.3 также включает в себя множество улучшений производительности, обновлений и исправлений, включая изменения в вызове Proc #, использование ключевых слов исключения для Socket и IO, обработку имени Thread #, пассивные соединения Net :: FTP по умолчанию и удаление Rake из stdlib. [50]

Ruby 2.4 [ править ]

Ruby 2.4.0 был выпущен на Рождество в 2016 году. Несколько заметных изменений включают:

  • Привязка # irb: начать сеанс REPL, аналогичный привязке .pry
  • Объедините Fixnum и Bignum в целочисленный класс
  • String поддерживает сопоставление регистров Unicode, а не только ASCII
  • Новый метод Regexp # match?, Который является более быстрой логической версией Regexp # match.
  • Обнаружение взаимоблокировок потоков теперь показывает потоки с их обратной трассировкой и зависимостями

Ветвь 2.4 также включает улучшения производительности для хэш-таблицы, массива № max, массива № min ​​и доступа к переменной экземпляра. [51]

Ruby 2.5 [ править ]

Ruby 2.5.0 был выпущен на Рождество в 2017 году. [52] Некоторые заметные изменения включают:

  • операторы спасения и обеспечения автоматически используют окружающий блок конца (меньше необходимости в дополнительных блоках начала и конца )
  • Цепочка методов с yield_self
  • Поддержка покрытия филиалов и измерение покрытия методов
  • Более простые преобразования хэша с помощью Hash # slice и Hash # transform_keys

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

Ruby 2.6 [ править ]

Ruby 2.6.0 был выпущен на Рождество в 2018 году. [53] Некоторые заметные изменения включают:

  • JIT (экспериментальный)
  • RubyVM :: AbstractSyntaxTree (экспериментальный)

Ruby 2.7 [ править ]

Ruby 2.7.0 был выпущен на Рождество в 2019 году. [54] Несколько заметных изменений включают:

  • Сопоставление с образцом (экспериментальное)
  • REPL улучшение
  • ГХ уплотнения
  • Разделение позиционных и ключевых аргументов

Ruby 3.0 [ править ]

Ruby 3.0.0 был выпущен на Рождество в 2020 году. [55] Он известен как Ruby 3x3. Одна из его основных целей состояла в том, чтобы переключить интерпретатор на компилятор Just-In-Time, чтобы сделать программы быстрее.

Таблица версий [ править ]

Философия [ править ]

Юкихиро Мацумото , создатель Ruby

Мацумото сказал, что Ruby разработан для повышения продуктивности и развлечения программистов в соответствии с принципами хорошего дизайна пользовательского интерфейса . [90] На конференции Google Tech Talk в 2008 году Мацумото заявил: «Я надеюсь, что Ruby поможет каждому программисту в мире быть продуктивным, получать удовольствие от программирования и быть счастливым. Это основная цель языка Ruby». [91] Он подчеркивает, что при проектировании систем особое внимание следует уделять человеческим, а не компьютерным потребностям: [92]

Часто люди, особенно компьютерные инженеры, сосредотачиваются на машинах. Они думают: «Делая это, машина будет работать быстрее. Делая это, машина будет работать более эффективно. Делая это, машина будет что-то, что-то». Они сосредотачиваются на машинах. Но на самом деле нам нужно сосредоточиться на людях, на том, как люди заботятся о программировании или управлении приложениями машин. Мы мастера. Они рабы.

Говорят, что Ruby следует принципу наименьшего удивления (POLA), что означает, что язык должен вести себя таким образом, чтобы минимизировать путаницу для опытных пользователей. Мацумото сказал, что его основной целью при проектировании было создание языка, который ему самому нравилось использовать, за счет минимизации работы программиста и возможных путаниц. Он сказал, что не применил принцип наименьшего удивления к дизайну Ruby, [92]но, тем не менее, эта фраза стала тесно ассоциироваться с языком программирования Ruby. Эта фраза сама по себе вызвала удивление, поскольку начинающие пользователи могут подумать, что это означает, что поведение Ruby пытается максимально соответствовать поведению, знакомому по другим языкам. В ходе обсуждения в группе новостей comp.lang.ruby в мае 2005 года Мацумото попытался дистанцировать Ruby от POLA, объясняя это тем, что, поскольку любой выбор дизайна будет для кого-то неожиданным, он использует личный стандарт при оценке неожиданности. Если этот личный стандарт останется неизменным, то для тех, кто знаком с ним, будет мало сюрпризов. [93]

Мацумото определил это так в интервью: [92]

У каждого индивидуальное прошлое. Кто-то может прийти из Python, кто-то из Perl, и они могут быть удивлены различными аспектами языка. Затем они подходят ко мне и говорят: «Меня удивила эта особенность языка, поэтому Ruby нарушает принцип наименьшего удивления». Ждать. Ждать. Принцип наименьшего удивления подходит не только вам. Принцип наименьшего удивления означает принцип наименьшего моего удивления. И это означает принцип наименьшего удивления после того, как вы очень хорошо изучите Ruby. Например, я был программистом на C ++, прежде чем начал разрабатывать Ruby. Два-три года я программировал исключительно на C ++. И после двух лет программирования на C ++ меня это все еще удивляет.

Особенности [ править ]

  • Тщательно объектно-ориентированный с наследованием , миксинами и метаклассами [94]
  • Динамический набор текста и утиный набор текста
  • Все является выражением (даже операторами ), и все выполняется императивно (даже объявлениями )
  • Краткий и гибкий синтаксис [95], который минимизирует синтаксический шум и служит основой для предметно-ориентированных языков [96]
  • Динамическое отражение и изменение объектов для облегчения метапрограммирования [97]
  • Лексические замыкания , итераторы и генераторы с блочным синтаксисом [98]
  • Буквальное обозначение массивов , хэшей , регулярных выражений и символов
  • Встраивание кода в строки ( интерполяция )
  • Аргументы по умолчанию
  • Четыре уровня области видимости переменных ( глобальный , класс , экземпляр и локальный ), обозначаемых сигиллами или их отсутствием
  • Вывоз мусора
  • Первоклассные продолжения
  • Строгие логические правила принуждения ( верно все, кроме falseи nil)
  • Обработка исключений
  • Перегрузка оператора
  • Встроенная поддержка рациональных чисел , комплексных чисел и арифметики произвольной точности
  • Пользовательское поведение отправки (через method_missingи const_missing)
  • Собственные нити и кооперативные волокна (волокна - это функция 1.9 / YARV )
  • Поддержка Unicode и множественных кодировок символов .
  • Собственный плагин API на C
  • Интерактивная оболочка Ruby ( REPL )
  • Централизованное управление пакетами через RubyGems
  • Реализовано на всех основных платформах
  • Большая стандартная библиотека, включая модули для YAML , JSON , XML , CGI , OpenSSL , HTTP , FTP , RSS , curses , zlib и Tk [99]

Семантика [ править ]

Ruby является объектно-ориентированным : каждое значение является объектом, включая классы и экземпляры типов, которые многие другие языки обозначают как примитивы (например, целые числа , логические значения и « null »). Переменные всегда содержат ссылки на объекты. Каждая функция - это метод, и методы всегда вызываются для объекта. Методы, определенные в области верхнего уровня, становятся методами класса Object. Поскольку этот класс является предком любого другого класса, такие методы можно вызывать для любого объекта. Они также видны во всех областях, эффективно выполняя роль «глобальных» процедур. Ruby поддерживает наследование с динамической отправкой , миксиныи одноэлементные методы (принадлежащие к одному экземпляру и определенные для него, а не определенные в классе). Хотя Ruby не поддерживает множественное наследование , классы могут импортировать модули как миксины.

Ruby был описан как многопарадигмальный язык программирования : он допускает процедурное программирование (определение функций / переменных вне классов делает их частью корневого объекта, объекта «сам»), с объектной ориентацией (все является объектом) или функциональным программированием (это имеет анонимные функции , замыкания и продолжения ; все операторы имеют значения, а функции возвращают последнюю оценку). Он поддерживает интроспекцию , рефлексию и метапрограммирование , а также поддерживает потоки на основе интерпретатора [100] . Ruby поддерживает динамическую типизацию и поддерживаетпараметрический полиморфизм .

Согласно Ruby FAQ, синтаксис похож на Perl, а семантика аналогична Smalltalk , но сильно отличается от Python . [101]

Синтаксис [ править ]

Синтаксис Ruby в целом аналогичен синтаксису Perl и Python . Определения классов и методов сигнализируются ключевыми словами, тогда как блоки кода могут быть определены ключевыми словами или фигурными скобками. В отличие от Perl, переменные не обязательно имеют префикс сигилы . При использовании сигил изменяет семантику области видимости переменной. Для практических целей нет различия между выражениями и утверждениями . [102] [103] Разрывы строк важны и считаются концом оператора; может использоваться точка с запятой. В отличие от Python, отступы не имеют значения.

Одно из отличий от Python и Perl заключается в том, что Ruby сохраняет все свои переменные экземпляра полностью приватными для класса и предоставляет их только через методы доступа ( attr_writer, attr_readerи т. Д.). В отличие от методов «геттер» и «сеттер» других языков, таких как C ++ или Java , методы доступа в Ruby могут быть созданы с помощью одной строки кода с помощью метапрограммирования ; однако методы доступа также могут быть созданы традиционным способом C ++ и Java. Поскольку вызов этих методов не требует использования круглых скобок, легко преобразовать переменную экземпляра в полную функцию, не изменяя ни одной строки вызывающего кода или не выполняя какой-либо рефакторинг для достижения аналогичной функциональности C # иЧлены свойства VB.NET .

Дескрипторы свойств Python похожи, но требуют компромисса в процессе разработки. Если кто-то начинает в Python с использования общедоступной переменной экземпляра, а позже изменяет реализацию, чтобы использовать частную переменную экземпляра, предоставляемую через дескриптор свойства, внутренний код класса может потребовать корректировки для использования частной переменной, а не открытого свойства . Дизайн Ruby заставляет все переменные экземпляра быть частными, но также предоставляет простой способ объявления setи getметодов. Это соответствует идее о том, что в Ruby никогда нельзя напрямую обращаться к внутренним членам класса извне; скорее, человек передает сообщение классу и получает ответ.

В разделе « Примеры » ниже приведены образцы кода, демонстрирующие синтаксис Ruby.

Взаимодействие [ править ]

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

$ irb irb (main): 001: 0> помещает  'Hello, World' Hello, World => nil irb (main): 002: 0> 1 + 2 => 3

Примеры [ править ]

Следующие ниже примеры можно запустить в оболочке Ruby, такой как Interactive Ruby Shell , или сохранить в файле и запустить из командной строки путем ввода .ruby <filename>

Классический пример Hello world :

помещает  "Hello World!"

Базовый код Ruby:

# Все, включая литерал, является объектом, поэтому это работает: - 199 . abs  # => 199 'лед хорош' . length  # => 11 'рубин классный.' . index ( 'u' )  # => 1 "Хороший день, не правда ли?" . вниз . сплит ( '' ) . uniq . сортировать . присоединиться  # => "'? acdeinsty"

Вход:

print  'Пожалуйста, введите имя>' name  =  получает . chomp помещает  "Привет # { имя } ".

Конверсии:

ставит  "Дай мне номер" число  =  получает . chomp ставит  номер . to_i output_number  =  число . to_i  +  1 помещает  output_number . to_s  +  '- большее число.'

Строки [ править ]

Существует множество способов определения строк в Ruby.

Следующие назначения эквивалентны:

a  =  " \ n Это строка в двойных кавычках \ n " a  =  % Q { \ n Это строка в двойных кавычках \ n } a  =  % { \ n Это строка в двойных кавычках \ n } a  =  % / \ nЭто строка в двойных кавычках \ n / a  =  << - БЛОКЭто строка в двойных кавычках БЛОК

Строки поддерживают интерполяцию переменных :

var  =  3 . 14159 "пи равно # { var } " =>  "пи равно 3,14159"

Следующие присвоения эквивалентны и производят необработанные строки :

a  =  'Это строка в одинарных кавычках' a  =  % q {Это строка в одинарных кавычках}

Коллекции [ править ]

Построение и использование массива :

a  =  [ 3 ,  'привет' ,  14 . 5 ,  1 ,  2 ,  [ 6 ,  15 ]]а [ 2 ]  # => 14,5 а . [] ( 2 )  # => 14,5 а . обратный  # => [[6, 15], 2, 1, 14.5, 'привет', 3] а . сплющить . uniq  # => [3, 'hello', 14.5, 1, 2, 6, 15]

Создание и использование ассоциативного массива (в Ruby, называемого хешем ):

hash  =  Хеш . new  # эквивалент hash = {} hash  =  {  water :  'wet' ,  fire :  'hot'  }  # делает предыдущую строку избыточной, так как теперь мы  # назначаем хеш новому, отдельному объекту хеширования put  hash [ : fire ]  # печатает "горячо"хэш . each_pair  do  | ключ ,  значение |  # или: hash.each do | ключ, значение |  помещает  " # { key } is # { value } " end # возвращает {: water => "wet",: fire => "hot"} и печатает: # water is wet # fire is hotхэш . delete  : water  # удаляет пару: water => 'wet' и возвращает "мокрый" хеш . delete_if  { | ключ , значение |  value  ==  'hot' }  # удаляет пару: fire => 'hot' и возвращает {}

Структуры управления [ править ]

Если заявление:

# Сгенерировать случайное число и распечатать четное или нечетное. если  rand ( 100 ) . четное?  ставит  "Это даже", иначе  ставит  "Это нечетно" конец

Блоки и итераторы [ править ]

Два синтаксиса для создания блока кода:

{  ставит  "Hello, World!"  }  # обратите внимание на фигурные скобки # или: do  ставит  'Hello, World!' конец

Блок кода может быть передан методу как необязательный аргумент блока. У многих встроенных методов есть такие аргументы:

Файл . open ( 'file.txt' ,  'w' )  делать  | файл |  # 'w' обозначает  файл "режима записи" . ставит  "написал текст". end  # здесь автоматически закрывается файлФайл . readlines ( 'file.txt' ) . каждый  делать  | линия |  помещает  конец строки # => Написал какой-то текст.

Параметр, передающий блок в закрытие :

# В переменной экземпляра объекта (обозначается '@') запомните блок. def  запомнить ( & a_block )  @block  =  конец a_block# Вызвать предыдущий метод, присвоив ему блок с именем. помните  { | имя |  помещает  "Привет, # { name } !" }# Вызвать закрытие (обратите внимание, что это происходит не для закрытия каких-либо свободных переменных): @block . call ( 'Jon' )  # => "Привет, Джон!"

Создание анонимной функции :

proc  { | arg |  помещает  аргумент } Proc . новый  { | arg |  помещает  arg } лямбда  { | arg |  помещает  аргумент } -> ( аргумент )  { помещает  аргумент }  # введено в Ruby 1.9

Возврат замыканий из метода:

def  create_set_and_get ( initial_value = 0 )  # обратите внимание на значение по умолчанию 0  closure_value  =  initial_value  [  Proc . новый  { | х |  closure_value  =  x },  Proc . новый  {  closure_value  }  ] конецsetter ,  getter  =  create_set_and_get  # возвращает установщик двух значений . вызовите ( 21 ) геттер . звоните  # => 21# Переменные параметра также можно использовать в качестве привязки для закрытия, # поэтому предыдущее можно переписать как:def  create_set_and_get ( closure_value = 0 )  [  proc  { | х |  closure_value  =  x  }  ,  proc  {  closure_value  }  ] конец

Передача потока программного управления блоку, который был предоставлен во время вызова:

def  use_hello  yield  конец "привет"# Вызвать предыдущий метод, передав ему блок. use_hello  { | строка |  помещает  строку }  # => 'привет'

Перебор перечислений и массивов с использованием блоков:

массив  =  [ 1 ,  'привет' ,  3 . 14 ] массив . каждый  { | пункт |  put  item  } # выводит: # 1 # 'привет' # 3.14массив . each_index  { | индекс |  помещает  " # { индекс } : # { массив [ индекс ] } "  } # выводит: # 0: 1 # 1: 'привет' # 2: 3,14# В следующем примере используется (a..b) Range ( 3 .. 6 ) . каждый  { | число |  put  num  } # выводит: # 3 # 4 # 5 # 6# Следующее использует a (a ... b) Range ( 3 ... 6 ) . каждый  { | число |  put  num  } # выводит: # 3 # 4 # 5

Такой метод injectможет принимать как параметр, так и блок. injectМетод перебирает каждый элемент списка, выполняя определенную функцию на ней, сохраняя при этом агрегате. Это аналог foldlфункции в языках функционального программирования . Например:

[ 1 , 3 , 5 ]. inject ( 10 )  { | сумма ,  элемент |  сумма  +  элемент }  # => 19

На первом проходе блок получает 10 (аргумент для вставки) как sumи 1 (первый элемент массива) как element. Это возвращает 11, которое затем становится sumна следующем проходе. Он прибавляется к 3, чтобы получить 14, которое затем прибавляется к 5 на третьем проходе, чтобы окончательно вернуть 19.

Использование перечисления и блока для возведения в квадрат чисел от 1 до 10 (с использованием диапазона ):

( 1 .. 10 ) . собирать  { | х |  x * x }  # => [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

Или вызовите метод для каждого элемента ( mapявляется синонимом collect):

( 1 .. 5 ) . map ( & : to_f )  # => [1.0, 2.0, 3.0, 4.0, 5.0]

Классы [ править ]

Следующий код определяет класс с именем Person. В дополнение к initializeобычному конструктору для создания новых объектов у него есть два метода: один для переопределения <=>оператора сравнения (чтобы Array#sortможно было сортировать по возрасту), а другой для переопределения to_sметода (чтобы Kernel#putsможно было форматировать его вывод). Вот attr_readerпример метапрограммирования в Ruby: attr_accessorопределяет методы получения и установки переменных экземпляра, но attr_readerтолько методы получения. Последний оцененный оператор в методе - это его возвращаемое значение, что позволяет пропустить явный returnоператор.

Класс  Person  attr_reader  : имя ,  : возраст  Защиты  инициализации ( имя ,  возраст )  @name ,  @age  =  имя ,  возраст  конец  Защиты  <=> ( человек )  # оператор сравнения для сортировки  @age  <=>  человека . age  end  def  to_s  " # { @name } ( # { @age } )"  end endgroup  =  [  Человек . новый ( "Боб" ,  33 ),  Человек . новый ( «Крис» ,  16 ),  Персона . новый ( "Ясень" ,  23 ) ]ставит  группу . сортировать . обеспечить регресс

Предыдущий код печатает три имени в обратном возрастном порядке:

Боб (33)Ясень (23)Крис (16)

Personявляется константой и является ссылкой на Classобъект.

Открытые классы [ править ]

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

# повторно открыть класс Ruby Time class  Time  def  вчера  self  -  86400  end endсегодня  =  Время . now  # => 2013-09-03 16:09:37 +0300 вчера  =  сегодня . вчера  # => 2013-09-02 16:09:37 +0300

Добавление методов к ранее определенным классам часто называют исправлением обезьян . При неосторожном выполнении такая практика может привести как к конфликтам поведения с последующими неожиданными результатами, так и к проблемам с масштабируемостью кода.

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

# Повторно открыт класс времени в Ruby модуль  RelativeTimeExtensions  точного  времени  сделать  Защиту  half_a_day_ago  себя  -  43200  конец  конец конецmodule  MyModule  class  MyClass  # Разрешить использование уточнения с  помощью  RelativeTimeExtensions  время окна  def . сейчас . half_a_day_ago конец конец конец  

Исключения [ править ]

Исключение возникает при raiseвызове:

поднимать

К исключению можно добавить необязательное сообщение:

поднять  "Это сообщение"

Исключения также могут быть указаны программистом:

поднять  ArgumentError ,  "Недопустимые аргументы!"

В качестве альтернативы в raiseметод можно передать экземпляр исключения :

поднять  ArgumentError . new ( «Незаконные аргументы!» )

Эта последняя конструкция полезна при создании экземпляра настраиваемого класса исключения с конструктором, который принимает более одного аргумента:

class  ParseError  <  Exception  def  initialize ( input ,  line ,  pos )  super  "Не удалось проанализировать ' # { input } ' в строке # { line } , position # { pos } "  end endподнять  ParseError . новый ( "Фу" ,  3 ,  9 )

Исключения обрабатываются rescueпредложением. Такое предложение может перехватывать исключения, наследуемые от StandardError. Другие ключевые слова управления потоком, которые можно использовать при обработке исключений: elseи ensure:

начать  # не то , что спасение  # ручка исключение остальные  # это сделать , если исключение не было поднято обеспечить  # это сделать , было ли или не поднятое исключением конца

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

begin  # сделайте что-нибудь, спасите  Exception  # здесь код обработки исключения.  # Не пишите только «спасение»; который перехватывает только StandardError, подкласс Exception. конец

Или поймать определенные исключения:

begin  # сделать что-нибудь спасти  RuntimeError  # обработать только RuntimeError и его подклассы end

Также можно указать, что объект исключения должен быть доступен для предложения обработчика:

начать  # сделать что - то спасение  RuntimeError  =>  е  # обработки, возможно , с участием е, такие , как «заносит e.to_s» конец

В качестве альтернативы самое последнее исключение сохраняется в magic global $!.

Также можно отловить несколько исключений:

начать  # сделать что - то спасательная  RuntimeError ,  таймаут :: Ошибка  =>  е  обращения #, возможно , с привлечением й конца

Метапрограммирование [ править ]

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

Например, следующий код Ruby генерирует новые методы для встроенного Stringкласса на основе списка цветов. Эти методы заключают содержимое строки в HTML-тег, стилизованный под соответствующий цвет.

ЦВЕТА  =  {  черный :  «000» ,  красный :  «f00» ,  зеленый :  «0f0» ,  желтый :  «ff0» ,  синий :  «00f» ,  пурпурный :  «f0f» ,  голубой :  «0ff» ,  белый :  «fff»  }class  String  COLORS . каждый  делать  | цвет , код |  define_method  "in_ # { color } "  do  "<span style = \" color: # # { code } \ " > # { self } </span>"  конец  конец конец

Сгенерированные методы затем можно использовать следующим образом:

"Привет, мир!" . in_blue  =>  "<span style = \" color: # 00f \ " > Привет, мир! </span>"

Для реализации эквивалент во многих других языках, программист должен написать каждый метод ( in_black, in_red, in_greenи т.д.) отдельно.

Некоторые другие возможные варианты использования метапрограммирования Ruby включают:

  • перехват и изменение вызовов методов
  • внедрение новых моделей наследования
  • динамически генерирующие классы из параметров
  • автоматическая сериализация объекта
  • интерактивная помощь и отладка

Реализации [ править ]

Интерпретатор Ruby Маца [ править ]

Исходный интерпретатор Ruby часто называют Ruby Interpreter или MRI Матца . Эта реализация написана на C и использует собственную виртуальную машину, специфичную для Ruby .

Стандартизированная и устаревшая реализация Ruby 1.8 была написана на C как однопроходный интерпретируемый язык . [27]

Начиная с Ruby 1.9 и продолжая с Ruby 2.x и выше, официальным интерпретатором Ruby был YARV («Еще одна виртуальная машина Ruby»), и эта реализация заменила более медленную виртуальную машину, используемую в предыдущих выпусках MRI.

Альтернативные реализации [ править ]

По состоянию на 2018 год существует ряд альтернативных реализаций Ruby, включая JRuby , Rubinius и mruby . Каждый из них использует свой подход: JRuby и Rubinius обеспечивают своевременную компиляцию, а mruby также обеспечивает предварительную компиляцию .

У Ruby есть три основных альтернативных реализации:

  • JRuby , смешанная реализация Java и Ruby, работающая на виртуальной машине Java . JRuby в настоящее время нацелен на Ruby 2.5.
  • TruffleRuby , реализация Java с использованием среды реализации языка Truffle с GraalVM
  • Rubinius , виртуальная машина с байт-кодом C ++, которая использует LLVM для компиляции в машинный код во время выполнения. Компилятор байт-кода и большинство основных классов написаны на чистом Ruby. Rubinius в настоящее время нацелен на Ruby 2.3.1.

Другие реализации Ruby включают:

  • MagLev , Smalltalk реализация , которая работает на GemTalk Systems " GemStone / S VM
  • mruby , реализация, предназначенная для встраивания в код C, аналогично Lua . В настоящее время его разрабатывают Юкихиро Мацумото и другие.
  • RGSS, или Ruby Game Scripting System, запатентованная реализация, которая используется серией программного обеспечения RPG Maker для разработки игр и модификации движка RPG Maker.
  • Transpiler (частичный) от Руби Julia , julializer доступен. Его можно использовать для значительного ускорения, например, по сравнению с реализациями Ruby или JRuby (может быть полезно только для числового кода). [104]
  • Topaz , реализация Ruby, написанная на Python
  • Opal , веб-интерпретатор, который компилирует Ruby в JavaScript.

Другие, ныне несуществующие реализации Ruby:

  • MacRuby , реализация Mac OS X в среде выполнения Objective-C . Его аналог для iOS называется RubyMotion.
  • IronRuby - реализация на .NET Framework
  • Cardinal, реализация виртуальной машины Parrot
  • Ruby Enterprise Edition , часто сокращенно ree , реализация, оптимизированная для обработки крупномасштабных проектов Ruby on Rails.
  • HotRuby , JavaScript и ActionScript реализация языка программирования Ruby ,

Зрелость реализаций Ruby обычно измеряется их способностью запускать фреймворк Ruby on Rails (Rails), потому что он сложен в реализации и использует многие специфические для Ruby функции. Момент, когда конкретная реализация достигает этой цели, называется «сингулярностью Rails». Эталонная реализация, JRuby и Rubinius [105] могут запускать Rails без изменений в производственной среде.

Поддержка платформы [ править ]

Мацумото первоначально делал развитие Рубин на 4.3BSD -На Sony NEWS-OS 3.x, но потом мигрировали свою работу в SunOS 4.x, и , наконец , к Linux . [106] [107]

К 1999 году было известно, что Ruby работает во многих различных операционных системах , включая NEWS-OS, SunOS, AIX , SVR4 , Solaris , NEC UP-UX , NeXTSTEP , BSD, Linux, Mac OS , DOS , Windows и BeOS . [108]

Современные версии и реализации Ruby доступны во многих операционных системах, таких как Linux, BSD, Solaris, AIX, macOS , Windows, Windows Phone , [109] Windows CE , Symbian OS , BeOS и IBM i .

Язык программирования Ruby поддерживается рядом платформ облачного хостинга, таких как Jelastic , Heroku , Google Cloud Platform и другие.

Хранилища и библиотеки [ править ]

RubyGems - менеджер пакетов Ruby. Пакет Ruby называется «жемчужиной» и может быть легко установлен через командную строку. Большинство драгоценных камней представляют собой библиотеки, хотя существует несколько приложений, таких как IDE . [110] На RubyGems.org размещено более 10 000 гемов Ruby .

Многие новые и существующие библиотеки Ruby размещены на GitHub , сервисе, который предлагает размещение репозитория контроля версий для Git .

Архив приложений Ruby, в котором размещались приложения, документация и библиотеки для программирования Ruby, поддерживался до 2013 года, когда его функции были переданы RubyGems. [111]

См. Также [ править ]

  • Сравнение языков программирования
  • Metasploit Project  - крупнейший в мире проект Ruby с более чем 700 000 строк кода.
  • Почему (пронзительный) путеводитель по Ruby  - онлайн-учебник по Ruby в формате графической новеллы
  • XRuby  - статический компилятор Ruby в Java
  • Crystal  - язык программирования, вдохновленный Ruby

Ссылки [ править ]

  1. ^ https://www.ruby-lang.org/en/news/2020/12/25/ruby-3-0-0-released/ .
  2. ^ "[ruby] Содержимое / trunk / КОПИРОВАНИЕ" . Дата обращения 2 мая 2015 .
  3. ^ "[ruby] Содержимое / trunk / GPL" . Дата обращения 2 мая 2015 .
  4. ^ "[ruby] Содержимое / trunk / BSDL" . Дата обращения 2 мая 2015 .
  5. ^ a b c Купер, Питер (2009). Начало Ruby: от новичка до профессионала . Начиная от новичка до профессионала (2-е изд.). Беркли: АПресс. п. 101. ISBN 978-1-4302-2363-4. В меньшей степени Python, LISP, Eiffel, Ada и C ++ также повлияли на Ruby.
  6. ^ "Confreaks TV | Причины Ruby - Ruby Conference 2008" . confreaks.tv . Проверено 25 июня 2019 .
  7. ^ Б с д е е Бини, Оле (2007). Практические проекты JRuby on Rails Web 2.0: перенос Ruby on Rails в Java . Беркли: АПресс. п. 3 . ISBN 978-1-59059-881-8. Он основан в основном на функциях Perl, Smalltalk, Python, Lisp, Dylan и CLU.
  8. ^ Бини, Ола. «Иок» . Ioke.org . Архивировано из оригинала на 2011-07-21 . Проверено 21 июля 2011 . вдохновлен Io, Smalltalk, Lisp и Ruby
  9. ^ «Julia 1.0 Documentation: Introduction» . Проверено 6 октября 2018 года .
  10. ^ Беркс, Тим. «О Ну ™» . Программирование Nu ™ . Дизайн Технология Неон, Inc . Проверено 21 июля 2011 .
  11. ^ Ring Team (3 декабря 2017 г.). «Кольцо и другие языки» . ring-lang.net . Ring-lang .
  12. ^ "Справочник по ржавчине" . Дата обращения 16 ноября 2019 .
  13. ^ Латтнер, Крис (2014-06-03). "Домашняя страница Криса Латтнера" . Крис Латтнер . Проверено 3 июня 2014 . Язык Swift является продуктом неустанных усилий команды языковых экспертов, гуру документации, ниндзя по оптимизации компиляторов и невероятно важной внутренней группы, которая предоставила отзывы, чтобы помочь усовершенствовать и протестировать идеи. Конечно, он также очень выиграл от опыта, с трудом завоеванного многими другими языками в этой области, черпая идеи из Objective-C, Rust, Haskell, Ruby, Python, C #, CLU и слишком многих других, чтобы перечислить.
  14. ^ "О Руби" . Дата обращения 15 февраля 2020 .
  15. ^ "Confreaks TV | Причины Ruby - Ruby Conference 2008" . confreaks.tv . Проверено 25 июня 2019 .
  16. ^ Shugo Маэда (17 декабря 2002). «FAQ по языку Ruby» . Проверено 2 марта 2014 .
  17. Мацумото, Юкихиро (13 февраля 2006 г.). «Re: Шепелявые особенности Ruby» . Дата обращения 15 февраля 2020 .
  18. ^ Б с д е е «История Рубин» .
  19. ^ «[FYI: исторический] Решающий момент в названии языка Ruby. (Re: [ANN] ruby ​​1.8.1)» (Электронное письмо от Хироши Сугихара на ruby-talk).
  20. ^ "Часто задаваемые вопросы по языку Ruby - 1.3 Почему такое название" Ruby "?" . Ruby-Doc.org . Проверено 10 апреля 2012 года .
  21. ^ Yukihiro Мацумото (11 июня 1999). "Re: имя Руби?" . Ruby-Talk (список рассылки) . Проверено 10 апреля 2012 года .
  22. ^ "Больше археолингвистики: раскопки прото-Рубина" . Архивировано из оригинала на 6 ноября 2015 года . Дата обращения 2 мая 2015 .
  23. ^ "[ruby-talk: 00382] Re: история рубина" . Дата обращения 2 мая 2015 .
  24. ^ "[ruby-list: 124] РУКОВОДСТВО - особенности рубина" . Дата обращения 2 мая 2015 .
  25. ^ «Интервью с создателем Ruby» .
  26. ^ Yukihiro Мацумото (октябрь 2000). «Программирование Ruby: Вперед» . Проверено 5 марта 2014 .
  27. ^ a b «Мы удаляем Ruby 1.8.7» . Дата обращения 2 мая 2015 .
  28. ^ «IPA 独立 行政 法人 情報 処理 推進 機構 : プ 発 表 プ ロ グ ラ ム Ruby の JIS 規格 (JIS X 3017) 制定 に つ い て» . Дата обращения 2 мая 2015 .
  29. ^ «IPA 独立 行政 法人 情報 処理 推進 機構 : プ レ ス 発 表 プ ロ グ ラ ム Ruby 、 国際 規格 と し て 承認» . Дата обращения 2 мая 2015 .
  30. ^ «ISO / IEC 30170: 2012» . Проверено 10 марта 2017 .
  31. ^ Веб-разработка: Ruby on Rails . Devarticles.com (22 марта 2007 г.). Проверено 17 июля 2013.
  32. ^ "Выпущен Ruby 1.9.3 p0" . ruby-lang.org. 31 октября 2011 . Проверено 20 февраля 2013 года .
  33. ^ "v1_9_3_0 / NEWS" . Репозиторий исходного кода Ruby Subversion . ruby-lang.org. 17 сентября 2011 . Проверено 20 февраля 2013 года .
  34. ^ Ruby 1.9: чего ожидать . slideshow.rubyforge.org. Проверено 17 июля 2013.
  35. ^ «Поддержка Ruby 1.9.3 закончилась» . Дата обращения 2 мая 2015 .
  36. ^ ЭндоН, Юсук. (2013-02-24) Выпущен Ruby 2.0.0-p0 . Ruby-lang.org. Проверено 17 июля 2013.
  37. ^ ЭндоН, Юсук. (2013-02-24) Выпущен Ruby 2.0.0-p0 . Ruby-lang.org. Проверено 17 июля 2013.
  38. ^ США (2016-02-24). «Планы поддержки Ruby 2.0.0 и Ruby 2.1» . Ruby-lang.org . Проверено 18 апреля 2017 .
  39. ^ "Выпущен Ruby 2.1.0" . 25 декабря 2013 . Проверено 26 декабря 2013 года .
  40. ^ «Семантическое управление версиями, начиная с Ruby 2.1.0» . 21 декабря 2013 . Проверено 27 декабря 2013 года .
  41. ^ «Поддержка Ruby 2.1 закончилась» . Проверено 4 апреля 2017 года .
  42. ^ «Ruby 2.2.0 выпущен» . 25 декабря 2014 . Проверено 4 января 2015 года .
  43. ^ "ruby / НОВОСТИ в v2_2_0 · ruby ​​/ ruby ​​· GitHub" . GitHub . Дата обращения 2 мая 2015 .
  44. ^ «Поддержка Ruby 2.2 закончилась» . Дата обращения 29 декабря 2019 .
  45. ^ Густаво Фредерико Темпл Педроса, Витор де Лима, Леонардо Бьянкони (2015). «Выпущен Ruby 2.2.1» . Проверено 12 июля +2016 .CS1 maint: несколько имен: список авторов ( ссылка )
  46. ^ Густаво Фредерико Темпл Педроса, Витор де Лима, Леонардо Бьянкони (2015). «Журнал изменений v2.2.1» . Проверено 12 июля +2016 .CS1 maint: несколько имен: список авторов ( ссылка )
  47. ^ Густаво Фредерико Темпл Педроса, Витор де Лима, Леонардо Бьянкони (2014). «Указание энергонезависимых регистров для повышения производительности в ppc64» . Проверено 12 июля +2016 .CS1 maint: несколько имен: список авторов ( ссылка )
  48. ^ Густаво Фредерико Темпл Педроса, Витор де Лима, Леонардо Бьянкони (2014). «Указание MACRO для увеличения производительности в ppc64» . Проверено 12 июля +2016 .CS1 maint: несколько имен: список авторов ( ссылка )
  49. ^ «Изменения и особенности Ruby 2.3.0 - Работа с Ruby» . dev.mensfeld.pl .
  50. ^ "Ruby / NEWS at v.2_3_0 - ruby ​​/ ruby ​​- Github" . GitHub . Проверено 25 декабря 2015 года .
  51. ^ «Ruby 2.4.0 выпущен» . www.ruby-lang.org . Проверено 30 декабря 2016 .
  52. ^ «Ruby 2.5.0 выпущен» . Проверено 2 мая 2018 .
  53. ^ «Выпущен Ruby 2.6.0» . Язык программирования Ruby . 2018-12-25 . Проверено 25 декабря 2018 .
  54. ^ "Ruby 2.7.0 выпущен" . Язык программирования Ruby . 2019-12-25 . Проверено 25 декабря 2019 .
  55. ^ «Ruby 3.0.0 выпущен» . Язык программирования Ruby . 2020-12-25 . Проверено 25 декабря 2020 .
  56. ^ "Рождественские релизы сообщества Ruby" . www.rubyinside.com .
  57. ^ «Патч во времени: защита Рубина» .
  58. ^ "Ruby-1.8.0 выпущен!" . www.ruby-lang.org .
  59. ^ «Планы на 1.8.7» . www.ruby-lang.org .
  60. ^ «EOL для Ruby 1.8.7 и 1.9.2» . www.ruby-lang.org .
  61. ^ "Ruby 1.9.3-p551 выпущен" . www.ruby-lang.org .
  62. ^ «Ruby 1.9.0 выпущен» . www.ruby-lang.org .
  63. ^ «Поддержка Ruby версии 1.9.3 закончится 23 февраля 2015 г.» . www.ruby-lang.org .
  64. ^ «Поддержка Ruby 1.9.3 закончилась» . www.ruby-lang.org .
  65. ^ a b c «Выпущен Ruby 2.0.0-p648» . www.ruby-lang.org .
  66. ^ "Выпущен Ruby 2.0.0-p0" . www.ruby-lang.org .
  67. ^ «Ruby 2.1.10 выпущен» . www.ruby-lang.org .
  68. ^ "Выпущен Ruby 2.1.0" . www.ruby-lang.org .
  69. ^ «Планы поддержки Ruby 2.0.0 и Ruby 2.1» . www.ruby-lang.org .
  70. ^ «Ruby 2.1.9 выпущен» . www.ruby-lang.org .
  71. ^ «ReleaseEngineering - Ruby - Система отслеживания проблем с Ruby» . bugs.ruby-lang.org .
  72. ^ a b «Поддержка Ruby 2.1 закончилась» . www.ruby-lang.org .
  73. ^ «Ruby 2.2.10 выпущен» . www.ruby-lang.org .
  74. ^ «Ruby 2.2.0 выпущен» . www.ruby-lang.org .
  75. ^ «Ruby 2.2.7 выпущен» . www.ruby-lang.org .
  76. ^ «Ruby 2.3.8 выпущен» . www.ruby-lang.org .
  77. ^ «Ruby 2.3.0 выпущен» . www.ruby-lang.org .
  78. ^ a b «Поддержка Ruby 2.2 закончилась» . www.ruby-lang.org .
  79. ^ «Ruby 2.4.10 выпущен» . Язык программирования Ruby . 2020-03-31 . Проверено 1 апреля 2020 .
  80. ^ «Ruby 2.4.0 выпущен» . www.ruby-lang.org .
  81. ^ a b «Поддержка Ruby 2.4 закончилась» . www.ruby-lang.org .
  82. ^ «Ruby 2.5.8 выпущен» . Язык программирования Ruby . 2020-03-31 . Проверено 1 апреля 2020 .
  83. ^ «Ruby 2.5.0 выпущен» . www.ruby-lang.org .
  84. ^ «Ruby 2.6.6 выпущен» . Язык программирования Ruby . 2020-03-31 . Проверено 1 апреля 2020 .
  85. ^ «Выпущен Ruby 2.6.0» . www.ruby-lang.org .
  86. ^ «Ruby 2.7.2 выпущен» . Язык программирования Ruby . 2020-10-02 . Проверено 2 октября 2020 .
  87. ^ "Ruby 2.7.0 выпущен" . www.ruby-lang.org .
  88. ^ «Ruby 3.0.0 выпущен» . Язык программирования Ruby . 2020-12-25 . Проверено 25 декабря 2020 .
  89. ^ «Ruby 3.0.0 выпущен» . www.ruby-lang.org .
  90. ^ "Язык программирования Ruby" . Дата обращения 2 мая 2015 .
  91. ^ Google Tech Talks - Ruby 1.9 на YouTube
  92. ^ a b c Билл Веннерс. «Философия Рубина» . Дата обращения 2 мая 2015 .
  93. ^ «Добро пожаловать на RUBYWEEKLYNEWS.ORG» . 4 июля 2017. Архивировано 4 июля 2017 года.CS1 maint: bot: исходный статус URL неизвестен ( ссылка )
  94. Брюс Стюарт (29 ноября 2001 г.). «Интервью с создателем Ruby - O'Reilly Media» . Дата обращения 2 мая 2015 .
  95. ^ Билл Веннерс. «Динамическая производительность с Ruby» . Дата обращения 2 мая 2015 .
  96. ^ "Language Workbenches: приложение-убийца для языков, специфичных для предметной области?" . martinfowler.com . Дата обращения 2 мая 2015 .
  97. ^ «Ruby - Добавить методы класса во время выполнения» .
  98. ^ Билл Веннерс. «Блоки и замыкания в Ruby» . Дата обращения 2 мая 2015 .
  99. ^ Бритт, Джеймс. «Документация по стандартной библиотеке Ruby 2.0.0» . Проверено 9 декабря 2013 .
  100. ^ Зеленые нити
  101. ^ "Часто задаваемые вопросы о языке Ruby: как Ruby сочетается с ...?" . Дата обращения 2 мая 2015 .
  102. ^ "[ruby-talk: 01120] Re: Значение while ..." В синтаксисе Ruby оператор - это просто частный случай выражения, которое не может выступать в качестве аргумента (например, множественное присваивание).
  103. ^ "[ruby-talk: 02460] Re: Вопрос о приоритете" . оператор [...] не может быть частью выражения, если не заключен в круглые скобки.
  104. ^ «GitHub - remove / virtual_module: Создан, чтобы сделать ваш код Ruby более чем в 3 раза быстрее. Надеюсь» .
  105. Питер Купер (18 мая 2010 г.). «Почему, что и как выпущен Rubinius 1.0» .
  106. ^ Майя Stodte (февраль 2000). «IBM developerWorks - Ruby: новый язык» . Архивировано из оригинального 18 августа 2000 года . Проверено 3 марта 2014 .
  107. ^ Yukihiro Мацумото (август 2002). "lang-ruby-general: Re: вопрос о начальной разработке Ruby" . Проверено 3 марта 2014 .
  108. ^ Yukihiro Мацумото (5 января 1999). «ruby-talk: Re: ха, проверьте эти ошибки» . Проверено 3 марта 2014 .
  109. ^ «Железный Рубин на Windows Phone 7» .
  110. ^ "Набор инструментов Ruby" . Проверено 4 апреля 2015 .
  111. ^ "Мы удаляем raa.ruby-lang.org" . 2013-08-08 . Проверено 3 января 2016 .

Дальнейшее чтение [ править ]

  • Блэк, Дэвид; Лео, Джозеф (15 марта 2019 г.), The Well-Gounded Rubyist (Third ed.), Manning Publications , стр. 584, ISBN 978-1617295218
  • Мец, Сэнди (22 августа 2018 г.), Практическое объектно-ориентированное проектирование: Agile Primer Using Ruby (второе издание), Addison-Wesley Professional , стр. 288, ISBN 978-0-13-445647-8
  • Купер, Питер (12 июля 2016 г.), Начало Ruby: от новичка к профессионалу (третье изд.), Apress , стр. 492, ISBN 978-1484212790
  • Карлсон, Лукас; Ричардсон, Леонард (3 апреля 2015 г.), Ruby Cookbook: Recipes for Object-Oriented Scripting (Second ed.), O'Reilly Media , p. 963, ISBN 978-1449373719
  • Фултон, Хэл; Арко, Андре (2 марта 2015 г.), Ruby Way: Solutions and Techniques in Ruby Programming (Третье издание), Addison-Wesley Professional , стр. 816, ISBN 978-0-321-71463-3
  • Томас, Дэйв; Фаулер, Чад; Энди Хант (7 июля 2013 г.), Programming Ruby 1.9 & 2.0: The Pragmatic Programmers 'Guide (четвертое изд.), Pragmatic Bookshelf , стр. 888, ISBN 978-1937785499
  • МакЭналли, Джереми; Аркин, Ассаф (28 марта 2009 г.), Рубин на практике (первое издание), Manning Publications , стр. 360, ISBN 978-1933988474
  • Фланаган, Дэвид; Мацумото, Юкихиро (25 января 2008 г.), Язык программирования Ruby (первое издание), O'Reilly Media , стр. 446 , ISBN 978-0-596-51617-8
  • Бэрд, Кевин (8 июня 2007 г.), Ruby by Example: Concepts and Code (First ed.), No Starch Press , p. 326, ISBN 978-1593271480
  • Фицджеральд, Майкл (14 мая 2007 г.), Learning Ruby (Первое издание), O'Reilly Media , стр. 255 , ISBN 978-0-596-52986-4

Внешние ссылки [ править ]

  • Официальный веб-сайт
  • Документация Ruby
  • Руби в Керли
  • Madhadron.com Критический анализ Ruby