Основы

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: ,

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: , ,

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: ,

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: ,

Работа с файловой системой в Ruby ч. 3: Стандартная библиотека Ruby: FileUtils и Pathname

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

ruby File APIПродолжая серию статей о File IO в Ruby, мы, в этой статье покопаемся в двух компонентах стандартной библиотеки языка Ruby, которые расширяют ядро Ruby IO API: модуль FileUtils и класс Pathname.

Модуль FileUtils

Модуль FileUtils предоставляет интересный подход к манипуляции файлами путем эмуляции множества команд Unix для работы с файлами и большинства их опций (флагов). То, что вы можете сделать командами типа rm -rf и ln -s может быть выполнено соответственно методами FileUtils.rb_rf и FileUtils.ln_s.

Так как они придерживаются синтаксиса знакомого большинству Ruby-программистов они являются очень простыми для понимания, делая список вызовов методов FileUtils очень похожим на сеанс bash. Пример, что приведен ниже демонстрирует эту схожесть:

require "fileutils"

FileUtils.touch(["some_file.rb", "another_file.rb"])
FileUtils.mkdir("code")
FileUtils.mv(["another_file.rb", "../other_file.rb"], "code")

Dir["code/*"]
#>> ["code/some_file.rb", "code/another_file.rb"]

FileUtils.cp_r("code", "bkp")
FileUtils.rm_r("code")

Dir["code/*"]
#>> []
Dir["bkp/*"]
#>> ["bkp/some_file.rb", "bkp/another_file.rb"]

Read the rest of this entry »

Tags: , ,

Работа с файловой системой в Ruby ч. 2: Класс Dir

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

ruby File APIПродолжая серию о File IO API в Ruby, сегодня мы рассмотрим класс Dir.

Класс Dir

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

Read the rest of this entry »

Tags: , ,

Работа с файловой системой в Ruby ч. 1: Класс File

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

ruby File APIRuby обладет очень мощным API для работы с файловой системой, которое позволяет производить очень сложные операции с использованием минимального количества кода, однако множество методов и классов с похожими именами может несколько запутать новичка.

Класс File

Класс File является встроенным в язык классом (поэтому вам не нужно подключать его в файл с вашим кодом), предоставляет методы для самых популярных манипуляций с файлами. Как и многие другие IO-штуки в Ruby, File является подклассом (дочерним классом) IO, в который подмешивается модуль Enumerable. Давайте пробежимся по основам!

Read the rest of this entry »

Tags: ,

RubyDev Ruby Tutorial #7 >Исключительные ситуации в Ruby и их обработка

мая 23, 2011  |  Published in Ruby, Основы

Исключительные ситуации (exceptions) — это ошибки возникшие в вашем коде и которые также представлены в виде специальных объектов. Лично у меня самой популярной ошибкой, благодаря тому, что яне владею слепым набором, является NoMethodError или NameError:

Array.hello
#NoMethodError: undefined method `hello' for Array:Class
#from (irb):3
#from /home/vladimir/.rvm/rubies/ruby-1.9.2-p0/bin/irb:17:in `<main>'

hello
#NameError: undefined local variable or method `hello' for main:Object
#from (irb):4
#from /home/vladimir/.rvm/rubies/ruby-1.9.2-p0/bin/irb:17:in `<main>'

Ниже приведен иерархический список всех стандартных исключительных ситуаций в Ruby:

Read the rest of this entry »

Tags: ,

RubyDev Ruby Tutorial #6 > Регулярные выражения (Regular Expressions — RegExp) в Ruby

мая 15, 2011  |  Published in Ruby, Основы

1. регулярные выражения (Regular Expressions — RegExp) — что это?
Регулярные выражения — это очень мощная концепция, суть которой состоит в создании некоторого  шаблона строки, по которому можно производить поиск, проверку, замену, редактирование, разбиение и т.д. строки или ее подстроки.

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

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

Метасимвол — это символ или несколько символов используемые в шаблоне для определения какой-либо вещи.

В Ruby регулярное выражение является объектом класса Regexp и позволяет любые операции над собой, которые позволяет любой другой объект. Пример самого простого регулярного выражения:

//.class #=> Regexp

Как вы уже догадались, регулярные выражения (шаблоны) заключаются в символы слэшей. Любой набор символов заключенных между прямыми слэшами будет расцениваться интерпретатором Ruby как регулярное выражение. Также существуют другие способы создания регулярных выражений:

%r{regexp here} и Regexp.new(«»)
Read the rest of this entry »

Tags: , ,

Динамические свойства в Ruby

апреля 16, 2011  |  Published in Ruby, Основы

rubyЯ работал над приложением написанным на Rails 3, в котором пользователи могли объявлять собственные свойства экземпляра модели, которые могли им понадобится. Проблема тогда состояла в том, как динамически создавать свойства объекта?
Read the rest of this entry »

Tags: , ,