Ruby, язык программирования. RuPy.ru, Омск 2007.
Ruby – объектно-ориентируемый динамический интерпретируемый язык программирования высокого уровня. Ruby – мощный, практичный и элегантный язык. Ruby создан в 1995 году Юкихиро Матцумото (Япония) под влиянием Smalltalk, Eiffell и Perl.
1. Вкратце о языке.
Основной синтаксис. class SpaceMan < Dreamer attr_reader :name attr_accessor :rocket def = name end def end
Основной синтаксис. class SpaceMan < Dreamer attr_reader :name attr_accessor :rocket def = name end def end Классы. Объявление и наследование. class – ключевое слово для объявление класса. Символ < используется для наследования. Объявление в класса заканчивается ключевым словом end, как любой другой блок кода. Множественное наследование запрещено. Доступ к родительскому классу осуществляется с помощью ключевого слова super.
Основной синтаксис. class SpaceMan < Dreamer attr_reader :name attr_accessor :rocket def = name end def end Конструктор, методы и члены класса. Объявление метода в классе начинается с ключевого слова def, затем следует имя метода, и параметры. Метод-конструктор класса должен называться initialize. Любая переменная, имя которой начинающется с одного - член класса. С двух - статический член класса.
Основной синтаксис. class SpaceMan < Dreamer attr_reader :name attr_accessor :rocket def = name end def end Вызов метода. Метод вызывается, как и в большинстве языков, через точку, скобки с перечислением параметров после вызова можно опустить, если это не вызывает недоразумений.
Основной синтаксис. class SpaceMan < Dreamer attr_reader :name attr_accessor :rocket def = name end def end Ruby-символы. Идентификатор, и символ двоеточия в начале – это специальный объект в ruby, ruby-символ. В большинстве случаев можно считать, что это ссылка на строку. Точнее, что-то, что представляет строку или имя. Два ruby-символа с одинаковым именем – это один и тот же объект.
Основной синтаксис. class SpaceMan < Dreamer attr_reader :name attr_accessor :rocket def = name end def end Весь код в объявлении класса начинает выполнятся как только интерпретатор видит его. attr_reader и attr_accessor – вызов метода класса Module, добавляющего в класс методы для чтения и доступа к членам соответственно.
class Array def from_place(place) self.select do |s| s.where_i_am == place end flyers
class Array def from_place(place) self.select do |s| s.where_i_am == place end flyers
class Array def from_place(place) self.select do |s| s.where_i_am == place end flyers
class Rocket def travel_to(place) planet = fly_to place yield planet if block_given? fly_back end mike = SpaceMan.new(mike) mike.rocket = Rocket.new mike.rocket.travel_to(:mars).do |planet| mike.conquer! planet end Основной синтаксис. Код, написаный внутри блока, выполняется внутри метода, принимающего его. Этот метод рассматривает блок, как функцию, в которую можно передать какие-то параметры. Вызов блока и передача параметров происходит с помощью ключевого слова yield.
2. Ruby и Python.
Ruby и Python очень похожи. И Ruby и Python – это объектно-ориентированные высокоуровневые динамические языки программирования. Оба позволяют использовать метапрограммирование и, частично, функциональный стиль программирования. Пожалуй, можно найти лишь несколько существенных отличий.
Синтаксис. Основным синтаксическим отличием Ruby до Python 2.5 были блоки, как способ использования сопрограмм. Нововведения в Python 2.5 (измененный yield, with) позволяют писать код, который будет предоставлять те же возможности, что и ruby- блоки.
Использование и производительность Python позиционируется как язык общего назначения, в то время как для ruby пока что больше подходит роль языка для обработки строк и обёртки над C-библиотеками. В первую очередь на это влияет скорость интерпретатора. Программы на Python работают значительно быстрее, чем программы на ruby.
3. Некоторые скучные повседневные задачи с ruby.
Базы данных, ORM. ActiveRecord.
Задача: реализовать классы – обертки таблиц в базе данных, модели пользователей системы блогов. Описываемые таблицы:
recuire rubygems recuire activerecord class User < ActiveRecord::Base has_many :entries end class Entry < ActiveRecord::Base has_many :comments belongs_to :user end class Comment < ActiveRecord::Base belongs_to :entry belongs_to :user acts_as_tree end ActiveRecord. ActiveRecord – библиотека, позволяющая связать таблицу в базе данных и класс в ruby. Объект класса – наследника ActiveRecord::Base – имеет эксплицитно все методы для доступа к полям в таблице. has_many и belongs_to – отношения между таблицами в реляционной базе данных.
ActiveRecord. user = User.find_by_name(Kei Korte) user.entries.each do |entry| entry.comments each do |comment| if comment.user.name == Katy comment.destroy end End user.name = Ryan user.save Прямой доступ к таблице в базе данных объект имеет лишь в методах find, save, destroy. find_by_name – один из динамических методов для поиска в базе данных.
Генерация и парсинг XML. Builder и REXML.
Builder. recuire rubygems recuire builder xml = Builder::XmlMarkup.new xml.instruct! xml.customers do customers.each do |customer| xml.customer(id = customer) do xml.name {customer.name} xml. (customer. ) end Генерация xml –несложная задача, не зависимо от языка. В простых случаях легко можно обойтись и без внешних библиотек. Библиотека Builder позволяет просто генерировать xml-файлы, при помощи прокси- объекта, который создает очередной элемент xml исходя из названия вызываемого псевдо-метода.
Christian Newman Charlie Newman customers.xml
REXML require rexml/document include REXML xml_tree = Document.new(File.new('customers.xml')) puts N: + xml_tree.root.elements.size.to_s XPath.match(xml_tree,'//customer').each do |c| puts c.name+ #"+c.attributes['id'] c.elements.each do |element| puts "\t" + element.name+": "+element.text end Разбор xml-документов - всегда, наверное, не самая интересная задача. Здесь используется модуль REXML из стандартной библиотеки. REXML – это не единственный (и не самый производительный) метод для разбора XML в Ruby.
4. Недостатки.
Несмотря на то, что язык существует с середины 90х, общую известность он получил 2 года назад. Значимые недостатки в языке практически отсутствуют, но есть недостатки, возникшие из-за молодости языка. Хорошие глянцевые IDE, всегда переведенная на английский качественная документация, быстрый интерпретатор – всего этого нет.
Что-нибудь ещё? ruby-lang.org