Ruby — один из самых молодых языков программирования. Его создатель Юкихиро Мацумото (Yukihiro Matsumoto, также известный под псевдонимом Matz), профессиональный японский программист, рассказывает: <<Я начал разработку Ruby 24 февраля 1993 года. Первая hello world программа на Ruby заработала летом того же года, а aльфа-версия была готова к декабрю 1994.>> Название языка происходит от имени драгоценного камня рубина (по аналогии с другим широко распространенным языком программирования Perl: pearl — жемчуг).
Вот как характеризует Ruby его автор: <<Это мощный и динамический объектно-ориентированный язык с открытыми исходниками. Ruby работает на многих платформах, включая Linux и другие реализации Unix, MS-DOS, Windows 9x/2000/NT, BeOS и MacOS. Главная цель Ruby — эффективность разработки программ, и пользователи найдут, что программирование на нем эффективно и даже забавно>> .
В Японии Ruby стал популярным с момента появления первой общедоступной версии в 1995 году, однако наличие документации только на японском языке сдерживало его дальнейшее распространение. Лишь в 1997 году появилось описание Ruby на английском языке, а в 1998 году открылся форум ruby-talk. С этого момента Ruby начал свое шествие по всему миру. За последний год появились три англоязычные книги, посвященные ему (см. ), хотя на русский язык, к сожалению, ни одна из них еще не переведена. Сейчас Ruby входит в большинство дистрибутивов ОС Linux, доступен он и пользователям других операционных систем.
Заметим, что данная статья не является справочным руководством по языку. С кратким введением можно познакомиться в электронном учебнике , а более полная информация может быть найдена в и , а также на уже упомянутых выше сайтах сети интернет. Основная цель статьи — дать людям, уже знакомым с различными языками программирования, общее представление об особенностях Ruby, показать его мощь и красоту, объяснить, что он одинаково хорош и как первый язык программирования, и как средство для работы профессионального программиста и системного администратора.
В этом разделе мы изложим собранные из различных источников высказывания о языке Ruby, отложив на некоторое время рассмотрение примеров, иллюстрирующих их. Большая часть вопросов, которые будут затронуты, предполагает наличие определенных знаний у читателя в области теории языков и объектно-ориентированного программирования. Легче всего понять Ruby тем, кто знает Smalltalk, Lisp, C, C++ и Perl. <<Джентльменский>> набор из Perl, Java и C++ тоже является весьма хорошей стартовой позицией для изучения Ruby.
Тем же, кто не может похвастаться подобными знаниями, весьма приятно будет узнать, что
* <<если для изучения языка Perl Вам нужно потратить, скажем, три недели, то Python Вы изучите за неделю, а Ruby — за один день!>>
* <>.
Во введении мы уже цитировали Юкихиро Мацумото — создателя Ruby. Вот что еще он сам говорит об этом языке. Итак, Ruby
* имеет простой синтаксис;
* поддерживает обработку исключений;
* позволяет переопределять операторы;
* является чисто объектно-ориентированным языком (complete, full, pure object oriented language), в котором, в отличие от Java или Perl, все — объекты;
* позволяет работать с целыми числами произвольной величины;
* не требует объявления переменных;
* использует префиксы (@, $, @@) для задания области видимости (scope) переменных;
* поддерживает многопоточное программирование.
Одной из первых работ, привлекших внимание к Ruby, была уже несколько устаревшая статья Хала Фултона (Hal Fulton) <<Тридцать семь причин, по которым мне нравится Ruby>>. Вот некоторые из них.
Ruby является динамическим языком. В отличие от статических языков, подобных C++ или Java, методы и переменные в Ruby могут быть добавлены или переопределены во время выполнения программы. Это позволяет, например, обойтись без директив условной компиляции #ifdef, необходимых для языка C. Здесь проявляется сходство Ruby с такими языками, как Lisp и Smalltalk.
Ruby — интерпретируемый язык. Так как это свойство отрицательно сказывается на производительности, то хочется дать некоторые комментарии. Во-первых (и это самое главное), быстрый цикл разработки является важнейшим достоинством, которое <<перевешивает>> некоторые недостатки. Во-вторых, хотя Ruby и не является катастрофически медленным, в тех случаях, когда скорость абсолютно необходима, можно написать часть кода на языке C. Наконец, в-третьих, никто не сказал, что когда-нибудь не будет написан компилятор с языка Ruby.
В Ruby имеется возможность работы с регулярными выражениями. Когда-то они использовались только в некоторых утилитах UNIX-систем (grep, sed, vi). Затем, благодаря языку Perl, значительное число людей признало их мощь при обработке текстов. Ruby дает возможность использовать эту силу с еще большей легкостью.
Помните известную фразу Исаака Ньютона <<Если я видел дальше, чем другие, то только потому, что стоял на плечах гигантов>>? Ruby, безусловно, <<стоит на плечах гигантов>>, среди которых Smalltalk, CLU, Lisp, C, C++, Perl, Kornshell и другие языки. В Ruby собрано все лучшее, что накоплено человечеством в области языков программирования. При этом соблюдены следующие три принципа: не изобретать колесо, не чинить не сломанное, использовать имеющиеся у программистов знания и опыт. В Ruby пригодятся и знания о файлах и потоках из ОС UNIX, и спецификации функции printf из стандартной библиотеки ввода/вывода языка C, и умение работать с регулярными выражениями в Perl.
Ruby — язык написания сценариев (scripting language). Не следует считать, что это характеризует язык, как <<игрушечный>> или недостаточно мощный. Подобный язык должен быть интерпретируемым и способным заменить командные файлы, взаимодействующие с операционной системой и управляющие поведением других программ.
Ruby — универсальный и гибкий язык. С его помощью можно одинаково изящно реализовать как то, что традиционно делается с помощью интерпретатора Kornshell, так и то, что пишется обычно на C.
По простоте и богатству возможностей работы со строками и массивами языку Ruby нет конкурентов. Массивы являются динамическими, с ними можно оперировать как с множествами, стеками и очередями. Есть и ассоциативные массивы, работа с которыми также чрезвычайно проста и удобна.
Для языка Ruby уже написано большое число библиотек. Потоки, сокеты, объекты, сохраняемые между запусками программ, CGI-программы, базы данных, GUI — все это можно использовать, программируя на Ruby.
Дэйв Томас (Dave Thomas) и Энди Хант (Andy Hunt), соавторы первой книги по Ruby, вышедшей на английском языке, в интервью журналу «Dr. Dobb’s Journal» (январь 2001) говорят: <<Возьмите чисто объектно-ориентированный язык Smalltalk и избавьтесь от его причудливого синтаксиса. Добавьте комфорт и мощь языка Perl, но без всяких специальных случаев и магических преобразований. Заверните получившееся в ясный синтаксис, основанный частично на языке Eiffel, и добавьте понемногу от Scheme, CLU, Sather и Common Lisp. У вас получится Ruby.>> Фактически это означает, что Ruby — естественный и практически неизбежный результат эволюции современных языков программирования. Авторы данной статьи согласны с такой точкой зрения.
Хочется подчеркнуть, что Ruby не является панацеей для решения всех проблем программистов. Не следует отказываться от использования языков Java и C++ там, где их применение оправдано. С другой стороны, не разумно недооценивать возможности практического применения Ruby в реальных проектах.
Послушаем теперь высказывания лучших представителей программистского сообщества, которые сравнивают Ruby с другими языками.
Начнем с языка Java:
* Ruby — интерпретируемый язык;
* в Ruby все является объектом (в Java есть типы int и Integer, что создает определенные неудобства);
* переменные в Ruby не являются статически типизированными и не требуют объявления;
* модули (modules) в Ruby позволяют с помощью <<миксинов>> (mixins) конструировать подобие интерфейсов (interfaces) языка Java, допуская при этом в них реализацию методов.
Теперь сравним с языком Perl:
* Ruby значительно легче освоить, на нем легче программировать, а написанные программы проще сопровождать;
* в Ruby префиксы (@, $, @@) описывают область видимости (scope), а не тип переменной;
* Ruby позаимствовал из языка Perl регулярные выражения, переменную $_ и многое другое.
Завершим сопоставление Ruby с другими языками рассмотрением одного из ближайших <<конкурентов>> — языка Python. Это сравнение особенно интересно потому, что именно Python рассматривается сейчас многими, как хороший кандидат на роль первого языка программирования. Итак, сравним Ruby с языком Python:
* управляющие конструкции и методы в языке Ruby завершаются ключевым словом end, в то время как Python использует так называемый <<двумерный>> синтаксис, когда признаком завершения является изменение количества лидирующих пробелов в очередной строке программы;
* вместо self в Ruby для обозначения переменных экземпляра используется префикс @;
* в Ruby, в отличие от языка Python, понятия типа и класса являются синонимами;
* Python не поддерживает наследования и не позволяет добавлять методы к существующим типам;
* используемый в Ruby алгоритм сборки мусора позволяет проще писать реализации методов на языке C;
* расширения для Ruby, написанные на C/C++ позволяют определять новые классы;
* зачастую Ruby быстрее, чем Python.
И вновь дадим слово создателю языка. Его высказывание о планах дальнейшей работы над Ruby, выраженное в виде одной из управляющих конструкций языка, позволит нам плавно перейти к рассмотрению примеров реальных программ.
loop do read and reply mails write code write document/article/book write code end
Начнем с примеров, показывающих, что знание библиотек ввода/вывода языков C и C++ пригодится и в Ruby.
printf "Число: %5.2f; Строка: %s", 1.23, "Привет!" endl = "n"; $stdout << 17 << " красных шариков" << endl line = gets; print line
Специальная глобальная переменная $_ всегда содержит результат последней операции чтения. Она же используется как аргумент по умолчанию во многих конструкциях. Следующая программа, например, печатает все строки из входного потока, которые содержат слово Ruby.
while gets # присваивание очередной строки переменной $_ if /Ruby/ # сопоставление ее с образцом Ruby print # печать $_ end end
ARGF.each { |line| print line if line =~ /Ruby/ }
ARGF в Ruby — это объект, который представляет собой конкатенацию содержимого всех файлов, имена которых заданы в командной строке, либо просто стандартный поток ввода (в случае отсутствия аргументов).
Вот как выглядит на Ruby программа вычисления факториала числа, указываемого в качестве аргумента командной строки:
def fact(n) return 1 if n == 0 f = 1 while n>0 f *= n n -= 1 end return f end print fact(ARGV.to_i), "n"
Для вычисления с помощью этой программы, размещенной в файле fact.rb, значения 100! достаточно выполнить команду ruby fact.rb 100.
Три программы, рекурсивно вычисляющие 30-е число Фибоначчи, приведенные ниже, позволяют сравнить производительность интерпретаторов Ruby, Python и Perl.
# Ruby def fib(n) if n<2 n else fib(n-2)+fib(n-1) end end print fib(30), "n" # Python def fib(n): if n<2: return n else: return fib(n-2)+fib(n-1) print fib(30) # Perl sub fib { my($n)=@_; if ($n<2) { return $n; } else { return fib($n-2)+fib($n-1); } } print fib(30), "n";
Еще одна классическая задача — определение с помощью решета Эратосфена списка всех простых чисел, не превосходящих заданного (100 по умолчанию).
max = Integer(ARGV.shift || 100) sieve = for i in 2 .. max sieve[i] = i end for i in 2 .. Math.sqrt(max) next unless sieve[i] (i*i).step(max, i) do |j| sieve[j] = nil end end puts sieve.compact.join ", "
В качестве следующего примера рассмотрим решение на языке Ruby задачи, которая часто предлагается студентам первого курса, изучающим языки C/C++: для заданного текстового файла определить число вхождений в него каждого из встречающихся в нем слов. Использование ассоциативных массивов и ряда стандартных методов работы с файлами и строками позволяет написать чрезвычайно краткую и ясную программу.
freq = Hash.new(0) while gets() for word in $_.split(/W+/) freq += 1 end end for word in freq.keys.sort! print word, " -- ", freq, "n" end
Приведем два простых примера использования стандартной библиотеки классов. В результате выполнения первой программы будет найдено, что 7/8+1/8=1, а 7/8*1/8=7/64; вторая из них вычислит (1 + i)64.
require "rational" a = Rational(7,8) b = Rational(1,8) print a, "+", b, "=", a+b, "; ", a, "*", b, "=", a*b, "n" require "complex" a = Complex(1,1); print a**64
Без подробных объяснений приведем две эквивалентные программы, иллюстрирующие переопределение оператора для класса SongList. Ассоциативный массив (associative array, hash или dictionary) допускает индексирование произвольными объектами, а не только целыми числами. В данном случае оператор позволяет находить нужную песню не только по номеру, но и по ее названию.
class SongList def (key) if key.kind_of?(Integer) return @songs else for i in [email protected] return @songs[i] if key == @songs[i].name end end return nil end end class SongList def (key) return @songs if key.kind_of?(Integer) return @songs.find { |aSong| aSong.name == key } end end
Так как Ruby унаследовал лучшие особенности многих языков, то для выполнения достаточно стандартных действий обычно имеется несколько разных возможностей. Вот 13 (!) различных способов напечатать числа от 0 до 9:
i = 0 i = 0 while i < 10 begin print i , " " print i , " " i += 1 i += 1 end end while i < 10 i = 0 i = 0 until i >= 10 begin print i , " " print i, " " i += 1 i += 1 end end until i >= 10 for i in for i in (0..9) print i, " " print i, " " end end for i in (0...10) 10.times do |i| print i, " " print i, " " end end 0.upto(9) do |i| 9.downto(0) do |i| print i, " " print i, " " end end (0..9).each do |i| (0...10).each do |i| print i, " " print i, " " end end i = 0 loop do if i < 10 then print i, " " else break end i += 1 end
В заключение вопрос для тех, кто не знает языка Ruby: что напечатает следующая программа?
print ["L", "R", "H", "T"].collect { |x| x.succ }
Если вы сумеете угадать ответ, то это будет лучшим подтверждением тому факту, что Ruby интуитивно ясный язык. Если же не угадаете, то у вас будет еще одна причина изучить его.
Этот язык, несомненно, является одним из лучших в качестве первого языка программирования. Быстрый цикл разработки (редактирование — запуск — редактирование), использование интерпретатора, изначальная объектно-ориентированность, нетипизированные переменные, которые не требуют объявления, — все это позволяет учащимся сконцентрировать свое внимание на общих принципах программирования.
Не менее важны мультиплатформенность Ruby и его принадлежность к миру свободно распространяемого ПО. Еще один весомый аргумент в его пользу — возможность практического использования языка в самых разных областях, что не позволит впоследствии профессионалу, который вырастет из новичка, пожалеть о напрасно потраченном времени.
Можно заметить, что значительному числу перечисленных выше требований удовлетворяют и Python, и Java, и C++ и даже (в меньшей степени) Delphi. Последний из них, правда, является коммерческим продуктом, что автоматически должно было бы повлечь исключение его из рассмотрения. Однако в России даже среди организаторов олимпиад по программированию для школьников находятся люди, утверждающие, что стоимость дистрибутива Delphi составляет около 70 рублей!
Попробуем сначала сравнить языки Ruby и Java, посмотрев на них глазами человека, только начинающего знакомиться с миром программирования. Для такого человека чрезвычайно важна ясность и краткость программ, отсутствие в них странных и непонятных <<магических>> слов. А именно из них и состоит в основном Java-вариант традиционной первой программы!
public class Hello { public static void main(String args) { System.out.println("Здравствуй, мир!"); } }
Аналогичную программу на Ruby долго объяснять не придется:
puts "Здравствуй, мир!"
Ruby в этом смысле очень дружелюбный язык. Программа, написанная новичком, может быть очень короткой и не содержать ничего лишнего, а для создания такой программы необходим, в основном, только здравый смысл.
В отличие от языка Java в Ruby нет проблемы <<больших>> чисел. Приведенные выше программы вычисления факториала числа или чисел Фибоначчи, будучи написанными на Ruby, всегда дают верный результат. В случае же языка Java ограничения на диапазон представимых целых чисел приводят к нелепым (с точки зрения ученика школы или студента первого курса) равенствам типа
Неприятная неожиданность для человека, только приступающего к изучению программирования!
Еще одним важным фактором является простота методов, используемых в Ruby для ввода данных с клавиатуры или из файла. В случае языка Java сложность этих операций приходится тщательно маскировать, ограждая новичка от ненужных ему проблем.
Компактность дистрибутива Ruby и простота его установки в любой операционной системе позволяют школьнику или студенту без проблем работать на домашнем компьютере. Опять сравнение не в пользу Java!
Язык Python по многим параметрам похож на Ruby. Из приведенных выше различий этих двух языков для рассматриваемой нами ситуации начального обучения программированию особенно значимым оказывается <<двумерный>> синтаксис, используемый в языке Python. Эта особенность не является изначально понятной и на первых порах мешает. Вообще, основным аргументом в пользу Ruby в качестве первого языка программирования является именно его интуитивная ясность и предсказуемость, а не многие другие его преимущества.
Чем же хорош Ruby для профессионального программиста и системного администратора? Многое уже было сказано выше, но вот еще несколько интересных примеров и кратких комментариев.
По умолчанию строка, заключенная в обратные апострофы, заменяется результатом выполнения команды, в ней заданной. Можно, однако, и переопределить это поведение:
alias oldBackquote ` def `(cmd) result = oldBackquote(cmd) if $? != 0 raise "Command #{cmd} failed" end result end print `date` print `data`
CGI-скрипты, формы, работа с <<ключиками>> (cookies) — это только начало. Программы на Ruby могут быть внедрены прямо в HTML, что эквивалентно использованию таких средств, как ASP, JSP или PHP. При этом сохраняется вся мощь Ruby, а для повышения производительности можно использовать специальный модуль для Apache.
<%=key%> | <%=ENV%> |
---|
Ниже приведена программа, иллюстрирующая Tk расширение языка Ruby. Левая кнопка мыши позволяет рисовать прямые линии, а правая — создавать Postscript-файл с построенным изображением.
require "tk" class Draw def do_press(x, y) @start_x = x @start_y = y @current_line = TkcLine.new(@canvas, x, y, x, y) end def do_motion(x, y) if @current_line @current_line.coords @start_x, @start_y, x, y end end def do_release(x, y) if @current_line @current_line.coords @start_x, @start_y, x, y @current_line.fill "black" @current_line = nil end end def initialize(parent) @canvas = TkCanvas.new(parent) @canvas.pack @start_x = @start_y = 0 @canvas.bind("1", proc{|e| do_press(e.x, e.y)}) @canvas.bind("2", proc{ puts @canvas.postscript({}) }) @canvas.bind("B1-Motion", proc{|x, y| do_motion(x, y)}, "%x %y") @canvas.bind("ButtonRelease-1", proc{|x, y| do_release (x, y)}, "%x %y") end end root = TkRoot.new{ title "Canvas" } Draw.new(root) Tk.mainloop
Отметим, наконец, что конфигурация и установка дистрибутива Ruby осуществляется с помощью скриптов, написанных на нем самом.
Выпускники МГИУ специальности 2204 этого и предыдущего годов (многие из которых являются сейчас аспирантами) могут обнаружить, что язык Ruby во многом похож на известный им по занятиям на первом курсе язык C-Talk. Этот язык, который разрабатывался в нашем университете группой программистов под руководством Игоря Вячеславовича Абрамова (см. ), был основан в значительной мере на тех же самых идеях, которые взяты в качестве основополагающих автором Ruby.
Сегодня мне в асю кинули вот такой вот материал для размышления. К сожалению в Yandex"е я так и не смог найти сайт с оригиналом текста, но все же вот этот текст…
Ruby - один из самых молодых языков программирования. Своим именем он обязан драгоценному камню рубину (по аналогии с другим широко распространенным языком программирования Perl - жемчуг). Вот как описывает Ruby его создатель, японский программист Юкихиро Мацумото (Yukihiro Matsumoto): "Это мощный и динамический объектно-ориентированный язык с открытыми исходниками, который я начал разрабатывать в 1993 году. Ruby работает на многих платформах, включая Linux и многие реализации Unix, MS-DOS, Windows 9x/2000/NT, BeOS и MacOS. Главная цель Ruby - эффективность разработки программ, и пользователи найдут, что программирование на нем эффективно и даже забавно".
В Японии Ruby сильно потеснил такие известные языки как Python и Perl (а книга "Ruby the Object-Oriented Scripting Language" стала бестселлером) и начал распространяться по всему миру. За последний год появились три англоязычных книги, посвященные Ruby (к сожалению, пока не имеющие русского перевода). У этого языка очень неплохие шансы стать действительно популярным - ведь он вобрал в себя достоинства других языков, учтя их недостатки.
Ruby входит в стандартную поставку ОС Linux (начиная с версии 7.2), а пользователям MS Windows для первого знакомства стоит порекомендовать его несколько устаревшую версию, которая включает, помимо интерпретатора языка и библиотек, руководство пользователя, FAQ (ответы на часто задаваемые вопросы) и множество примеров. Ruby является свободно распространяемым продуктом, поэтому вы можете не беспокоиться ни о его стоимости, ни об ограничениях в его использовании.
Этот язык несомненно является одним из лучших в качестве первого языка программирования, изучаемого студентами и школьниками. Быстрый цикл разработки (редактирование - запуск - редактирование), использование интерпретатора, изначальная объектно-ориентированность языка, нетипизированные переменные, которые не требуют объявления - все это позволяет учащимся сконцентрировать свое внимание на общих принципах программирования. В дальнейшем изложении мы будем ориентироваться на работу в ОС Linux. Использование Ruby в других операционных системах практически ничем не отличается, а результаты выполнения не зависят от используемой ОС.
Сначала проверим, установлен ли интерпретатор Ruby в системе или нет. В окне shell введите команду ruby -v (этот ключ требует вывода версии языка). Если следующее сообщение появится, то Ruby установлен (версия, дата и платформа могут отличаться):
ruby 1.6.4 (2001-06-04)
puts "Hello, World!"
Для выполнения этой программы в командной строке введите
В результате выполнения программы в командном окне будет напечатана требуемая фраза.
Второй способ выполнения программ доступен пользователям не всех операционных систем, в которых функционирует Ruby. Пользователям ОС Linux следует поместить в начало файла с текстом программы следующую строку:
#!/usr/bin/env ruby
Она обязательно должна начинаться с первой позиции. Затем нужно изменить права доступа файла с программой, сделав его исполняемым: chmod +x hello.rb Теперь для запуска программы достаточно ввести команду
Для того чтобы сделать программу более понятной человеку, который ее читает, вставляются комментарии. Однострочные комментарии начинаются с символа # и продолжаются до конца строки. Многострочные комментарии заключают в специальные "скобки" - все, что располагается между строками =begin и =end, считается комментарием. Например,
#!/usr/bin/env ruby =begin Это комментарий =end puts "Hello, World!" # Это тоже комментарий
Программа на языке Ruby, часто называемая скриптом, есть последовательность инструкций (утверждений, предложений). Каждая инструкция по умолчанию заканчивается концом строки. Если же по каким-либо причинам требуется разместить несколько инструкций на одной строке, то их нужно разделять символом; (точка с запятой). С другой стороны, иногда инструкция не помещается на одной строке. В этом случае символ \ сигнализирует о том, что ее продолжение располагается в следующей строке.
Пример
#!/usr/bin/env ruby # Инструкция заканчивается концом строки puts "Hello, World!" # Несколько инструкций в одной строке puts "Это тест, "; puts "демонстрирующий работу Ruby." # Незаконченная инструкция, # продолжение которой на следующей строке puts "Программирование на Ruby - " + "приятное занятие." # Утверждение, разделенное на несколько строк puts \ "И мы обязательно этому научимся!"
Инструкция (утверждение) чаще всего представляет собой некую последовательность операторов, применяемых к различным выражениям, и (возможно) вызовов функций.
Я познакомился с Ruby
сравнительно недавно, благодаря чудесному фреймворку Ruby on Rails
. Я не считаю себя экспертом в Ruby, но я прочитал PickAxe, написал несколько утилит на Ruby для личного пользования, а также разрабатываю на Rails в свободное время.
Ruby на данный момент, мой основной язык. Начинал же я с TurboPascal
в школе, изучал C
и C++
в университете, дисертацию писал на Java
, а еще я изучал PHP
с нуля, так как хотел научиться делать веб-сайты быстро и легко. Думаю, что написание кода для меня это некая форма развлечения, а уж потом все остальное. В начале у меня были размышления, какой язык изучать, Python
или Ruby. Я выбрал второй, так как не хотел, чтоб неправильные отступы были причиной неполадок в моем коде.
Есть целая куча введений, руководств, статьей и эссе, написанных гуру, о том, как получить максимум пользы от Ruby. Данная статья ничем таким не является.
Это более скромный, неполный перечень причин, которые могут (или не могут) побудить вас использовать Ruby, ну или в крайнем случае поиграть с ним. Предостережение: если вы используете другой язык программирования для работы или в других целях - не жалуйтесь мне, если больше не захотите им пользоваться. Именно это и произошло со мной, но для меня это не столь важно. Ruby чудесный и элегантный язык и как многие подобные вещи, он может захватить ваш разум и поломать душу.
Короче, вы - предупреждены.
- «Че, 14 и 374346.678 - объекты?»
- «Нет, глупыш, это числа!»
С этого момента, все наши числа, будут иметь новый метод, который может использоваться, как любой другой:
5.feet # возвратит 16.4041995
Классы в Ruby
никогда не закрываются и могут быть расширены в любой момент, из любого места. Естественно использовать такую возможность надо с осторожностью!
Безусловно это легче и проще XML
, правда? Добро похаловать в YAML
, любимый (но не единственный) язык разметки Ruby
, с помошью которого любой объект может быть представлен в простом, лаконичном, но полном виде.
Ruby способен работать с XML
, но простота YAML
подкупила многих разработчиков, которые теперь используют его вместо XML
, например для файлов конфигурации (так поступили в Rails
). Фрагмент, представленный выше, был получен исполнением следующего фрагмента кода:
{"string" => "a string", "number" => 4.7, "regexp" => /a-zA-Z/}.to_yaml
Метод to_yaml
, определен для класса Object
, который является родителем для всех остальных объектов, а потому доступен для всех объектов Ruby
. Это позволяет преобразовывать объекты в YAML
и обратно, абсолютно прозрачно для разработчика. Круто, да?
Times3 = gen_times(3)
times5 = gen_times(5)
Times3.call(12) #=> 36
times5.call(5) #=> 25
times3.call(times5.call(4)) #=> 60
Можно было использовать ключевое слово lambda
вместо Proc.new
, на результат это не влияет. Это могло показаться знакомым людям, знающим Perl
и Python
(или Lisp
). Такое можно сдалать даже на PHP
, но не много людей пользуются этой возможностью.
Кроме того в Ruby
широко используются блоки типа «несозданные Proc
», например, для итерации по содержимому объекта и исполнения некоторого кода, подобно методу each
, доступного для класса Array
:
.each {|c| puts c*2} #=> возвратит каждый элемент, умноженный на 2
Если код не умещается на одной строчке, рекомендуется использовать конструкцию do… end
, вместо использования скобок. Фаны Ruby
не любят скобок.
Уважаемые Читатели - не забывайте, что хабраюзер, просто перевел (паршиво, да) текст. Идеологических претензий ему высказывать нет нужды.
В любом деле стоит, аргументировать свои слова. Я попытаюсь показать нам всю прелесть языка, почему мы его так рубим и лелеем.
Ruby интерпретируемый язык программирования
. Я уже говорил, что если вы прикажите этой тупой железяке 5.times{puts «hello!»}, то она не поймет этого без интерпретатора. Языки программирования требующие интерпретатора, который читает скрипты, написанные на них называются интерпретируемыми языками. Примерами таких языков являются (php, python, perl, bash и собственно наш великий!)
Языки, коды которых превращаются в программу называются компилируемыми. Примерами таких языков служит (C/C++ , C#, GO)
Разница состоит в том, что компилируемые программы компилируются один раз для множественного использования, а программы написанные на интерпретируемых языках интерпретируются каждый раз при своем запуске, из-за чего являются более медленными, но всегда с открытым исходным кодом:D
Скорость важна, но это не самое главное.
Ruby гораздо медленнее Си и еще медленнее Asembler’а, но это не мешает Ruby приобретать все новых и новых поклонников, которые сжигают образы своих старых богов, ломают бубны и обращаются в новую светлую религию Ruby-программизма.
Ruby позволяет писать приложения так быстро, что вы обанкротитесь нанимая спец отряд программистов на Си, которые напишут программу выполняющую те же действия. Кроме того, если вам нужно посчитать до завтра какой-нибудь финансовый расчет, то имеет ли для вас разницу то, будет он считаться 10 секунд или 0.1 секунду?
Даже если для вас будет действительно важна производительность, то у Ruby имеется огромное количество драйверов к библиотекам написанным на Cи, к различным базам данных и прочему программному обеспечению, таким образом получаете скорость Cи, при этом пишите код на Ruby.
Ruby также позволяет писать расширения на Си для критичных участков кода, то есть таких, где производительность крайне важна (все это потому, что Ruby сам написан на Си, не полностью, но довольно большой своею частью). Вам стоит привыкнуть к тому, что нет универсального языка программирования, зная который, вам больше ничего не нужно будет знать.
Ruby многолик
но в каждом лике он прекрасен. Есть стандартная реализация Ruby, она носит имя Matz Ruby Interpreter (MRI). Начиная с ветки 1.9 и по текущую используется другой интерпретатор YARV.
Также существует Ruby для виртуальной Java - машины (JRuby), который позволяет использовать все множество библиотек написанных на Java и других языках выполняемых на JVM, например Scala или Clojure.
Существует MacRuby - версия для Mac OS X.
Существует Ruby Enterprise Edition (Ruby EE или REE) - это несколько переделанный MRI, который позволяет программам на Ruby потреблять меньше оперативной памяти.
Существуют также различные авторские наработки, которые позволяют заменять оригинальные компоненты Ruby на более функционально богатые и быстрые, однако в силу того, что такие наработки, как правило, плохо испытаны в боевых условиях и не имеют широкого распространения, я бы не рекомендовал вам использовать их. Используйте официальные версии Ruby.
Помимо описанных реализаций Ruby существует еще большое количество, например Rubinius и Ruby MagLev и так далее. В чем их особенность я не знаю, но обязательно разберусь и опубликую в одной из следующих версий учебника.
Ruby - динамический язык программирования
. Это значит, что программы на Ruby являются динамичными, они могут изменяться непосредственно в момент исполнения. Не нужно задавать ограничение при создании. И вы некогда не переполните числовой тип данных.
Ruby обладает очень широкими возможностями метапрограммирования, такими, что им позавидует любой язык. Главное заключается в том, что это абстрация, а это реально эффективный подход к программированию, который позволяет писать реально мощные, богатые и функциональные приложения.
Ruby лаконичен
. Программы написанные на Ruby очень кратки и понятны. Виной тому и его высокоуровневость и динамичность и слабая типизированность.
Я не знаю таких языков, которые выигривали бы у Ruby по наименьшему числу строк кода для реализации определенного функционала. Подозревая что таких сейчас нет) на момент 2015 года, либо они столь запутаны и страшны, что боятся показаться.
Ruby - слаботипизированный язык программирования . В не которых других языках программирования вам необходимо было бы объявлять тип хранимых в переменной данных, при этом переменная не может хранить данных другого типа. Адепты программирования во главе с Якихиро Мацумото потрудились над тем, чтобы вы могли использовать переменные для хранения абсолютно любых значений без предварительного их объявления.
Ruby - объектно-ориентированный язык программирования
. Объектно-Ориентированный подход к программирванию уже совсем не нов и доказал не только свое право на жизнь, но и свою эффективность! Объектно-ориентированное Программирование (ООП) давно считается синонимом качества и масштабируемости кода.
ООП достаточно популярный подход к разработке программного обеспечения, который упрощает и ускоряет разработку, делает код более понятным и структурированным и расширяемым. Все создается с помощью абстракций, как будто объекты наших моделей реальны. В Ruby ООП реализовано особо изящно, не обошлось без магии на уровне базовых классов, однако это не так уж важно принимая во внимание реализация языка в общем.
Ruby - простой язык программирования.
Ruby простой для понимания язык программирования, простой для разработки, но не для изучения:). Разумеется, приложение выводящее на экран классическую фразу «hello world» вы можете написать уже в первую секунду знакомства, кстати вот она: puts «helo word!», однако чтобы добиться истинного мастерства, вам следует потратить годы!
Нельзя сравнивать Ruby с PHP, это как сравнивать элегантного лебеда с каким-то гусем, однако я пойду на такую жертву и сделаю это. Сам по себе язык Ruby не на много сложнее PHP в изучении, однако на много удобнее его и логичней. Сложнее сама экосистема Ruby, так как Ruby программисты привыкли все автоматизировать, и я наверное скажу не просто правду, но и истину, когда сообщу вам, что Ruby’исты продвинулись в этом куда дальше, чем какое-либо другое сообщество программистов. Эта автоматизация вынуждает разработчика изучать множество сторонних технологий, зато упрощает и сокращает затраты времени на побочные процессы разработки (тестирование, разворачивание приложения на сервере, и так далее). В PHP всего этого нет, либо все это совсем примитивно! Самое интересное, что порядка 25% PHP программистов не пользуются фреймворками и тонами плодят говнокод, попробуйте найти Ruby программиста, который не знаком с фреймворком Rails!
Главное помните большинство Ruby программистов являются экспертами, профессионалами в разработке. И вам всегда нужно к этому стремиться. Только так и не иначе, только радикальный подход к этому делу. Нельзя быть быть плохим программистом на Ruby, либо ты профессионал, либо не рубист!
Ruby и Rails тили-тили тесто! Rails, или Ruby on Rails - это фреймворк для создания веб приложений, который написан на Ruby. Rails - это реально переворот в мире веб разработки. Rails - это очень мощный фреймворк, который использует по максимуму все возможности Ruby, который обладает огромным сообществом профессиональных программистов, который плодят качественный расширения для и так богатого функционала.
Ruby - это все-таки мейнстрим технология!
Многие говорят, что Ruby это мало популярный язык программирования, однако он в ходит в 10 самых популярных ЯП, имеет огромное сообщество и огромное количество библиотек - rubygems.
Кстати, наличие у Ruby gem’ов - еще одно его преимущество над PHP! В PHP есть унылый Pear, который пишется обезъянами которые строят из себя космонавтов, об этом можно судить по тому, что в кодах Pear найдено много помета похожего на человеческий, но мы то знаем, что люди на это не способны.
И вообще я только что согрешил сравнивая RubyGems и Pear. На Ruby реализовано огромное количество крупных успешных проектов, что доказывает удачный выбор Ruby в качестве составляющего звена про построении бизнеса основанного на веб проекте. Ruby, как и Python также входящий в 10 самых популярных языков программирования, лишен одного очень большого изъяна мейнстримных технологий - Ruby не перенасыщен программистами, программисты на Ruby все еще дефицит, а значит ваша будущая зарплата в роли Ruby программиста будет гораздо больше по сравнения с теми, кто программирует на PHP или Java. Даже если спрос на Ruby программистов будет полностью удовлетворен, Ruby программист будет зарабатывать больше потому, что есть два очень важных фактора: более высокое качество кода и более высокая производительность труда.
Rubyist’ы - самая тестолюбивая тусовка. Я не знаю, так ли это, но то, что программисты на Ruby продвинулись явно очень далеко в тестировании собственного кода - это факт! Каждый более-менее опытный Ruby программист пишет спецификации и/или тесты для своего кода. Это делает код на Ruby более надежным и качественным.
Ruby сообщество более квалифицировано
, чем многие другие сообщества. В первую очередь речь идет о PHP - сообществе, которое весьма плодовито в выращивании уродов.
Каждый школьник разобравшийся с основами php за неделю и написавший свой кривой сайт уже кричит на всех углах, что он php программист. Нет я не испытываю ненависть к детям, то что вы изучаете и создаете это прекрасно. Но есть один нюанс, что за каждое слово в свой адрес нужно чем то ответить. Вообщем не будьте высокомерны, но совершенствуйтесь, занимайтесь тем, что вам нравится. А это и есть главное в нашей жизни!
Не каждый, кто программирует на Ruby достоен звания программиста, например я не достоин, потому, что имею крайне малый опыт и совсем недостаточный набор знаний, однако, если брать среднюю температуру по больнице, то сообщество Ruby значительно превосходит сообщество PHP. Не буду говорить о других языках программирования, так как Python, Java, и Perl являются основными экспортерами новых членов в сообщество Ruby, то есть многии программисты на Ruby добились своего мастерства работая с другими языками программирования и набрав достаточный багаж знания и опыта обратились в религию Ruby. Кроме того, многие люди, которые программируют на Ruby программируют и на Python и на Perl и на Java, Си, Objective-C, javascript, и, вы даже не поверите, на PHP.
Ruby (англ. ruby - рубин, произносится ["ru:bɪ] - ру́би) - интерпретируемый язык программирования высокого уровня. Обладает независимой от операционной системы реализацией многопоточности, строгой динамической типизацией, «сборщиком мусора» и многими другими возможностями, поддерживающими много разных парадигм программирования, прежде всего классово-объектную. Ruby был задуман в 1993 году (24 февраля) японцем Юкихиро Мацумото, стремившимся создать язык, совмещающий все качества других языков, способствующие облегчению труда программиста. По особенностям синтаксиса он близок к языкам Perl и Eiffel, по объектно-ориентированному подходу - к Smalltalk. Также некоторые черты языка взяты из Python, Lisp, Dylan и Клу. Кроссплатформенная реализация интерпретатора языка является полностью свободной.
Юкихиро Мацумото, создателю языка Ruby принадлежат следующие высказывания: "Человек создан для творчества, и я всегда знал, что люблю творить. Увы, я обделён талантом художника или музыканта. Зато умею писать программы."
"Я хочу, чтобы компьютер был моим слугой, а не господином, поэтому я должен уметь быстро и эффективно объяснить ему, что делать."
Мацумото, фанат объектно-ориентированного программирования, мечтал о языке более мощном, чем Perl, и более объектно-ориентированном, чем Python. Основное назначение Ruby - создание простых и в то же время понятных программ, где важна не скорость работы программы, а малое время разработки, понятность и простота синтаксиса. Язык следует принципу «наименьшей неожиданности»: программа должна вести себя так, как ожидает программист. Однако в контексте Ruby это означает наименьшее удивление не при знакомстве с языком, а при его основательном изучении. Сам Мацумото утверждает, что целью разработки была минимизация неожиданностей при программировании для него, но после распространения языка он с удивлением узнал, что мышление программистов похоже, и для многих из них принцип «наименьшей неожиданности» совпал с его принципом.
Вы можете получить копию Ruby несколькими способами, и разные люди предпочитают каждый из трех способов по разным причинам. Каждый будет описан в отдельной секции ниже, но вот краткий обзор:
Существует сторонние инструменты для установки Ruby. Они упрощают установку как совсем новичкам, так и продвинутым пользователям. Компиляция из исходников уже долгие годы является проверенным путем установки приложений. Этот способ знаком большому числу разработчиков приложений. Наконец, некоторые менеджеры пакетов поддерживают Ruby. Данный способ будет наиболее знаком людям, которые предпочитают пользоваться средствами операционной системы.
И наконец, если вы хотите использовать несколько версий Ruby на одной машине, посмотрите секцию сторонних приложений и использования RVM. В ней описан лучший на данный момент способ сделать это, если конечно вы знаете зачем вам это надо.
Многие руби-программисты используют сторонние инструменты для установки Ruby. Эти инструменты предоставляют различные преимущества, но не все из них официально поддерживаются. В любом случае их сообщество может оказать помощь.
Ruby Version Manager (RVM) – популярный инструмент для установки Ruby. Он позволяет устанавливать и управлять несколькими копиями Ruby в вашей системе, также как и несколькими альтернативными имплементациями Ruby.
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 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
puts "foo" foo => nil
Вывод – foo\n , но при этом значение – nil .
к примеру, итератор 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"
"boyz #{ 1 + 1 } men" => "boyz 2 men"
def add a , b a + b end add 2 , 2 #=> 4
class Calculator def add (a , b ) a + b end end calc = Calculator . new calc . add (2 , 2 ) #=> 4
Дана строка:)
var # локальная переменная (или вызов метода) @var # instance переменная @@var # переменная класса $var # глобальная переменная VAR # константа
Ruby как язык имеет несколько разных имплементаций. Данная статья посвящена оригинальной имплементации MRI (“Matz’s Ruby Interpreter” – Ruby интерпретатор Матца) или CRuby, но также существует несколько других. Они бывают очень полезны в различных ситуациях, предоставляют большую интеграцию с другими языками или окружениями, или имеют возможности, которых нет в MRI.