Ruby

RDRubyTutorial: Случайные числа в Ruby

декабря 28, 2011  |  Published in Ruby, Основы

В этой статье из цикла RubyDev Ruby Tutorial мы рассмотрим способы генерации случайного числа в Ruby 1.8.x и Ruby 1.9.x. Генерация случайного числа — достаточно тривиальная задача, особенно для Ruby однако некоторые новички даже здесь сталкиваются с проблемами. Кроме того, не все программисты знают о нововведениях в Ruby 1.9 связанных с генерацией случайных чисел.

Самым простым способом получить случайное число в Ruby является использование метода rand.

puts rand() #0.7063893161805139
puts rand() #0.5829631459496872
puts rand() #0.7625800525759028

Получение случайных чисел с плавающей точкой редко бывает полезным, чаще всего необходимо целове число.

puts rand(3) #0
puts rand(3) #1
puts rand(3) #1
puts rand(10) #3
puts rand(10) #7
puts rand(10) #8

Если методу rand передать в качестве аргумента целое число, то rand будет генерировать случайные числа в диапазоне от 0 до n-1.
Read the rest of this entry »

Tags: ,

Query-Chain Object Pattern в Ruby

ноября 25, 2011  |  Published in Ruby

Предупреждение: На самом деле я не знаю, как в действительности называюется этот паттерн, но название Query-Chain Object Pattern мне кажется очень подходящим.

Я был очень рад увидеть в ActiveRecord 3.0 такое значительное изменение, как добавление класса ActiveRecord::Relation. Этот класс, точнее его объекты, занимаются тем, что «накапливают» запросы в виде вызова методов и на их основе генерируют SQL-запрос к БД.

Post.where(:id => 3).class
#=> ActiveRecord::Relation

Post.where(:id => 3).order('id desc').class
#=> ActiveRecord::Relation

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

Эта статья не о работе с ActiveRecord, но о паттерне Query Chain.

Описание Query Chain:

При определенных запросах к некоторому объекту A объект A возвращает не запрашиваемые результаты, а query-chain объект B в котором записываются запросы, которые позже выполняются вместе и изменяют состояние объекта A, или который изменяет состояние объекта A сразу при каждом запросе (здесь запрос — просто вызов метода).

Самый простой пример реализации Query Chain паттерна:
Read the rest of this entry »

Tags: ,

RDRubyTutorial: Метапрограммный Ruby

октября 19, 2011  |  Published in Ruby, Основы

Метапрограммный Ruby
Эта статья-учебник даст вам самые основные знания и понимания программирования на языке Ruby. В ней, в отличие от RubyDev Ruby Tutorial (RDRT) не будет рассматриваться работа с какими-нибудь конкретными объектами, например строками или целыми числами, или с массивами, или с чем-либо еще. Мы будем рассматривать синтаксис и основные концепции языка и не будем изучать методы и приемы работы с определенными объектами — все это описано в официальной документации (учите английский).

Автор (то есть я) предполагает, что вы в общих чертах знаете, что такое Ruby, читали блог RubyDev или статью о Ruby в Wikipedia, по этому я не намерен повторяться и рассказывать о происхождении языка, истории, его авторе и прочих практически бесполезных вещах.

Данный учебник будет состоять из нескольких глав, которые будут пронумерованы.

1. Объекты
Ruby — объектно-ориентированный язык, а значит все, с чем мы работаем — объекты. Объекты принадлежат определенному классу (типу), например вы, мой дорогой читатель, которого, предположим зовут Александр Сергеевич принадлежите классу людей, или группе людей, или ваш тип, как объекта — человек.

Александр Сергеевич, кто вы?  — Я — Человек!

Объект — это набор свойств и методов. Александр Сергеевич, вы например, имеете свойства: имя, фамилия, отчество, рост, вес, цвет волос и так далее, но также вы имеете методы, то есть вы можете выполнять некоторую работу (выполнять некоторые функции), например, сидеть, стоять, разговаривать и отвечать комментариями на мои статьи.

Для того, чтобы появился новый объект вашего типа, Александр Сергеевич, вам следует совокупиться с некоторой человеческой особью женского пола и через 9 месяцев будет получен новый объект класса человек. В Ruby процесс создание новых объектов более быстрый и менее ресурсоемкий. Чуть позже мы разберемся с ним, а сейчас поговорим о классах.

Read the rest of this entry »

Tags: , ,

Интервью с Иваном Шихалевым об RDot и не только

октября 8, 2011  |  Published in Ruby, Ruby Gems, Интервью

Иван, добрый день! Представься пожалуйста читателям RubyDev и расскажи кратко о себе: где работаешь, чем увлекаешься?

Ну, кратенько: Иван Шихалев, временно безработный, живу в поселке Арти Свердловской области. Интересы у меня разнообразные, иногда кажется, что будь их поменьше, было бы проще жить. Отмечу, пожалуй, следующее: я являюсь одним из редакторов FreePascal.ru (и вообще, имею непосредственное отношение к формированию русскоязычного сообщества Free Pascal), а еще играю в спортивное «Что? Где? Когда?. Веду блог — http://shikhalev.blogspot.com/.

Расскажи пожалуйста о своем проекте RDot, его преимуществами перед аналогами и о том, почему была выбрана именно библиотека Graphitz?

RDot — это такой визуализатор структуры классов Ruby — именно такой, какой был нужен лично мне — с указанием не только наследования, но и подмешивания модулей посредством как include, так и extend, и с перечислением методов и констант. Его основное, пожалуй, отличие от аналогов — он не анализирует текст Ruby-библиотеки, а загружает ее и работает с реально сформированной структурой, т.е. отображает классы, модули и их методы, созданные динамически в процессе загрузки. Собственно, именно такая задача у меня изначально и возникла — увидеть динамическую структуру классов, которую не показывают стандартные средства документирования (под которыми я подразумеваю RDoc и YARD). Задача несколько экзотическая, согласен, но вполне реальная.
Read the rest of this entry »

Tags: ,

Паттерн программирования Singleton

октября 3, 2011  |  Published in Ruby, STDLIB

Singleton (одиночка) — паттерн программирования позволяющий создавать такие классы, которые могут иметь только один экземпляр. Можно подумать, что это глупый паттерн, ибо если вам нужен один экземпляр (копия) класса, то вы просто создаете его и не создаете больше экземляров. Я тоже так думал и даже пытался найти обоснование тому, почему этот паттерн существует. Я понимал, что все эти паттерны были придуманы людьми куда-более умными, образованными и опытными чем я, и кажащаяся бесполезность pattern Singleton — это всего-лишь мое невегласие. Вот к чему я пришел:

Допустим у нас имеется одно приложение состоящее из нескольких модулей, например тот же фреймворк Rails, или какое-нибудь десктопное приложение. Представьте, что в контексте одного модуля вы создаете некоторый объект, который в предложении может быть только один, например объект — запрос пользователя, которых хранит различную информацию о запросе, методы ее представления и что-то еще, или это десктопное приложение и объект представляет собой обычное окно приложение и это приложение является однооконным. Теперь добавим услувие, что мы подмешивая один модуль в другой не можем получить доступ к объекту на прямую, он инициируется внутри какого-то метода, что-то там делает, но метод нам его не возвращает, в этом случае все, что мы можем сделать — это создать новый объект, а старый будет для нас утерян если мы не создали какого-нибудь специального аксессора для доступа к нему.

Честно признаться в Ruby можно хорошо обходиться без использования Singleton, однако, вам может быть полезно и интересно знать о нем, просто для общего развития или для применения в других языках программирований.
Read the rest of this entry »

Tags: , , ,

HAML в Rails

октября 2, 2011  |  Published in ClientSide, Ruby Gems, Ruby on Rails, Ruby on Rails 3, View

haml logoHAML — очень удобный язык разметки который призван заменить HTML. HAML это также шаблонизатор, который компилирует код на HAML + Ruby  в HTML, который представляется пользователю.

Мне надоел стандартный ERB, надоели закрывающие теги, надоело, что порой бывает сложно понять что во что вложено, и я решил полностью перебраться на HAML. Если вы еще не слышали о HAML, то это не означает, что HAML — это что-то экзотическое, напротив, HAML использует большинство Rails разработчиков, так активно используют, что даже удивились, почему Rails Core Team невключили HAML в Raila 3.1. как шаблонизатор по умолчанию.

Начать работу с HAML совсем просто!

Read the rest of this entry »

Tags: , , ,

Паттерн программирования Observer в Ruby

октября 2, 2011  |  Published in Ruby, STDLIB

Патерн Observer относится к семейству publish/subscribe паттернов программирования. Observer предоставляет механизм для уведомления одним объектом другого при изменении собственного состояния. Объект, который сообщает об изменении своего состояния называется уведомителем или наблюдаемым объектом, а объекты, которые уведомляются об изменении состояния уведомителя называются подписчиками или наблюдателями.
Read the rest of this entry »

Tags: , , , ,

Ruby и красивый код: Рефаторинг поиска палиндромов

августа 27, 2011  |  Published in Ruby, Основы

В уютном бложеке одного из комментаторов нашел один пост-решение задачи, который меня заинтересовал (http://avastor.pp.ua/Ruby/ruby-polindrom/).

Задача состоит вот в чем:
Необходимо найти числа-палиндромы (которые при чтении слева и справа выглядят одинаково). Автор (к сожалению имени не знаю) предлагает следующее решение:

#Создаем массив чисел
numbers = []
(100).step(999,1) do |first|
  (100).step(999,1) do |second|
    numbers.push first * second
  end
end

#находим палиндром
polinoms = []
numbers.map do |subnumber|
  polinoms << subnumber if subnumber.to_s == subnumber.to_s.reverse
end

#максимальный палиндром
puts polinoms.max

Совет: Оборачивайте код в методы.
Read the rest of this entry »

Tags: ,

Awesome Print — удобное представление объектов в IRB и не только

июля 23, 2011  |  Published in Ruby, Ruby Gems

Awesome Print — полезный gem авторства Махаэля (Михаила) Дворкина, который занимается тем, что предоставляет удобное представление объектов в консоли.

Для установки Awesome Print следует просто выполнить в консоли следущую команду:

$ gem install awesome_print

Awesome Print также доступен в виде Rails-плагина, в таком случае его установку следует выполнять как установку любого другого Rail-плагина:

$ ruby script/plugin install http://github.com/michaeldv/awesome_print.git

Read the rest of this entry »

Tags: , ,

RDRubyTutorial > Рубиновые модули

июля 12, 2011  |  Published in Ruby, Основы

ruby modulesОбещал, что RubyDev Ruby tutorial будет закрыт, но не тут то было!
Вы уже должно быть прочитали главу посвященную классам и узнали о наследовании классов. Часто необходимо одмин классом наследоваться от нескольких классов, что называется множественным наследованием, однако Ruby по ряду причин не располагает возможностью множественного наследования. Отсутствие множественного наследования в Ruby несколько не препятствие и не показатель бедности и недостаточной функциональности языка, напротив, отсутствие множественного наследование избавляет программиста от различных проблем связанных с конфликтом имен, в то же время Ruby предоставляет свой альтернативу множественному наследованию — примеси (mixins).

Модули как раз таки и служат для реализации этого самого подмешивания, а также для логического объединения и инкапсуляции(отделения от внешнего мира) кода.

Представим, что ваше приложение на Ruby состоит из нескольких классов, тогда, поскольку приложение является чем-то монолитным, его следует объединить в модуль. Для особо крупных приложений используется сразу несколько модулей, один основной (корневой), который содержит приложение целиком, и несколько которые объединяют части кода приложения по определенному признаку, например в Rails имеетсямодуль ActiveRecord, который хранит весь код реализующий паттерн ActiveRecord для работы с базой данных, модуль ActiveSupport, который включает в себя другие модули, например ActionController, который хранит в себе весь код реализующий контроллеры, сам ActiveSupport отвечает за реализацию VC от паттерна MVC (Model-Viev-Controller, если забыли).

Что такое модуль? — Модуль это просто еще одно пространство имен, коробка, в которую вы укладываете ваш код, для того, чтобы он не путался с другими составляющими программы. Можете представлять модуль как примитивный класс, который лишен некоторых функций. Модули, что подмешиваются в классы называются примесями (mixin), все, что они делают — это просто дают классу в который были подмешаны доступ ко всему своему содержимому.

Read the rest of this entry »

Tags: ,