суббота, 4 августа 2007 г.

Ruby : Методы классов

Когда необходима возможность использовать класс не создавая его объект на помощь приходят методы класса. Методы от инстанции отличаются прежде всего способом их определения:
class Example
def instMeth # инстанция объекта
end
def Example.classMeth # метод класса
end
end

В качестве примера работы методов:

class Calc
def Calc.showSumm(i,k)
return i + k;
end
end
Calc.showSumm(5,4) // 9

Ruby : Объекты , атрибуты и прочее

Продолжаем тему ООП в Руби :).



class Song
def initialize(name, artist, duration)
@name = name
@artist = artist
@duration = duration
end
end


У нас есть атрбитуты name , artist , duarion но использовать вне объекта или через другие объекты мы их не можешь, а конкретно прочитать либо изменить, что собственно приводит к бесполезности объекта в какой-то степени. Для того, чтобы сделать атрибут читаемым и редактируемым нам следует сделать так:


class Song

attr_reader :name :artist :duration; # Разрешает чтение атрибута
attr_write :name :artist :duration; # Разрешает запись атрибута

def initialize(name, artist, duration)
@name = name
@artist = artist
@duration = duration
end
end


В доках по руби был приведен очень интересный пример использования переменные класса, к примеру у нас есть класс Song в котором есть метод инициализации и метод play который выводи сколько раз играла музыка и сколько раз играла конкретно взятая песня. Т.е мы создаём объекты класса Song, каждый объект это песня. Теперь вопрос:
Как сделать учёт того, сколько раз играла песня данного объекта и сколько раз всего играла музыка. Если говорить с точки зрения программирования на эту задачу, то вопрос стоит таким образом.
Как вести учёт того, сколько раз вызывался метод конкретного объекта и сколько раз вызывался этот метод вобще в целом. Решение:


class Song
@@plays = 0
def initialize(name, artist, duration)
@name = name
@artist = artist
@duration = duration
@plays = 0
end
def play
@plays += 1
@@plays += 1
"This song: #@plays plays. Total #@@plays plays."
end
end

####### дебаг)
s1 = Song.new("Song1", "Artist1", 234) # test songs..
s2 = Song.new("Song2", "Artist2", 345)
s1.play » "This song: 1 plays. Total 1 plays."
s2.play » "This song: 1 plays. Total 2 plays."
s1.play » "This song: 2 plays. Total 3 plays."
s1.play » "This song: 3 plays. Total 4 plays."

Переменные класса доступны для всех объектов вашего класса, объявлять их нужно до того как вы начнёте их использовать. Переменная класса начинается с двойной "@" в отличии от локальной переменной.Так же переменные класса доступны только для класса и его инстанций и если вы хотите использовать его извне то нужно прописать для них доступ, как это делать описано в начале заметки.

Ruby : Коротко об ООП

ООП в Ruby заслуживает уважения, оно гораздо мощнее и шире нежели в PHP5 и тем более PHP4, по-этому моё знакомство с этим языком не может не обойтись без рассмотрения принципов работы объектов в этом языке.

Следуя документации Ruby рассмотрим пример простого класса :

class Song
def initialize(name, artist, duration)
@name = name
@artist = artist
@duration = duration
end
end

Название класса начинается с заглавной буквы, а методы с маленькой :) , метод initialize аналогичен методу __construct в php, он исполняется в момент когда создают копию объекта.

Создать объект довольно просто:

aSong = Song.new("Stargazers", "Rainbow", 260)

Так же руби позволяет делать дамп объекта специальным методом inspect

aSong.inspect » "#Song:0x401b4924 @duration=260, @artist='Rainbow', @name='Stargazers'"

Если нам нужно наладить дамп объекта в другом формате для этого есть специальный метод to_s:

aSong.to_s » "#Song:0x401b499c"

Так как по дефолту это выводит лишь ID объекта мы можем переписать метод :)

class Song
def initialize(name, artist, duration)
@name = name
@artist = artist
@duration = duration
end

def to_s
"Song: #{@name}--#{@artist} (#{@duration})"
end
end
aSong = Song.new("Stargazer", "Rainbow", 260)
aSong.to_s » "Song: Stargazer--Rainbow(260)"

Родительские классы в Ruby рассмотрим на следующем примере:

class Song

def initialize(name, artist, duration)
@name = name
@artist = artist
@duration = duration
end

def to_s
"Song: #{@name}--#{@artist} (#{@duration})"
end
end

class KaraokeSong < Song
def initialize(name, artist, duration, lyrics)
super(name, artist, duration)
@lyrics = lyrics
end
end



Как вы заметили мы создали второй класс KaraokeSong и указали ему родительский класс Song. Для вызова initialize метода родительского мы используем super(). Все это видно из примера выше :)

super это очень интересная вещь ;) Он сообщает родительскому классу о том, что нужно вызвать метод с тем же именем из которого и был вызов super, в нашем примере мы вызываем super из метода initialize класса KaraokeSong в свою очередь super даёт задание вызвать метод initialize в классеSong, так как он родительский :)

пятница, 3 августа 2007 г.

Ruby On Rails : Массивы в руби ( часть первая )

Я уже писал о том, что мне очень нравится то как в Ruby реализованы массивы и то, что мне не нравится как это сделано в PHP. Опишу основны при работе с массивами в Ruby.

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

my_array = ['php', 'ruby', 'perl' , 'python']


Так же Ruby позволяет создавать массив на основе строки разделённой пробелами:

my_array = %w( php ruby perl python)


Так как в Ruby Array это класс, а наш массив это его объект, то создать нужный нам массив можно еще и этим способом.

my_array = Array.new
my_array << 'php'
my_array << 'ruby'
my_array << 'perl'
my_array << 'python'


Так же Ruby позволяет работать с массивами следующим образом

first = my_array.first # first = php

last = my_array.last # last = python

total = my_array.length # total = 4

Если нам нужно пройтись по всему массиву как мы это делали в php через foreach в Ruby это делается следующим образом:


games = ['startcraft', 'quake', 'warcraft']

games.each do |Game|
puts "#{Game} классная игра!"
end
=> startcraft классная игра!
=> quake классная игра!
=> warcraft классная игра!

Либо так :)


games = ['startcraft', 'quake', 'warcraft']

games.each_with_index do |game , index|
puts "#{index} : {game} классная игра!"
end
=> 1 : startcraft классная игра!
=> 2 : quake классная игра!
=> 3 : warcraft классная игра!

А еще можно вот так :)

items = ['Ruby On Rails', 'Ruby', 'My Self']

array_of_stuff = items.map do |item|
"i love #{item}"
end
# Массив array_of_stuff состоит сейчас из :
=> ['i love Ruby On Rails', 'i love Ruby', 'i love My Self']


И так основные моменты в работе с массивами я описал, дальше будет больше :)

четверг, 2 августа 2007 г.

Шаг второй: Особенности Ruby On Rails

Как только вы создадите новое предложение и готовы уже создавать проект вашей мечты, вам следует знать некоторые нюансы при работе с рельсами.

  1. В отличии от CakePHP где слой по умолчанию назывался default.ctp, а в Ruby On Rails все обстоит не многим иначе. Для каждого контроллера в приложении можно создать свой слой назвав его тем же именем как и контроллер и положив в папку layouts, так же предусмотрен layout по умолчанию, его имя application.rhtml и располагается он там же в папке Layouts.
  2. CakePHP использует расширение .ctp для вьюшек, в тоже время RubyOnRails использует .rhtml
  3. Я нигде не нашёл упоминания о том, что нужно удалять файл public/index.html, но это чётко упоминается при редактировании роутера.
  4. При работе с layout переменная в которой находится вывод контроллера назыается @content_for_layout :)
  5. Для вставки кода на ruby во вьюшку достаточно использовать следующую конструкцию <%= @peremennaya %>

среда, 1 августа 2007 г.

Web сервер для RubyOnRails

Прежде чем начинать, что-то создавать и изобретать .. подготовим платформу до конца :)
В состав диструбутива Ruby идёт веб-сервер WEBrick, что существенно облегчает жизнь при разработке :) Достаточно перейти в директорию с приложением и написать следующее :
c:\rails_www\test\>ruby script/server

Далее запустится WEBRick и вы сможете работать со своим проектом :)
Но так как нам везде нужна альтернатива ... мне очень стало интересно .. есть ли не что более лучшее чем WEBrick? Представляю вашему вниманию Mongrel!
Для установки Mongrel нам понадобится наш прошлый герой RubyGems и так открываем консоль :)
Ставим fastthread :)
c:\rails_www\>gem install fastthread --source=http://mongrel.rubyforge.org/releases
Need to update 8 gems from http://mongrel.rubyforge.org/releases
........
complete
Select which gem to install for your platform (i386-mswin32)
1. fastthread 1.0 (ruby)
2. fastthread 1.0 (ruby)
3. fastthread 1.0 (mswin32) <-- нам нужен этот вариант.
4. fastthread 0.6.4.1 (ruby)
5. fastthread 0.6.4.1 (mswin32)
6. Skip this gem
7. Cancel installation
> 3
Successfully installed fastthread-1.0-mswin32


И так fastthread я уже поставил, теперь установим mongrel :)

c:\rails_www\>gem install mongrel --source=http://mongrel.rubyforge.org/releases
Select which gem to install for your platform (i386-mswin32)
1. mongrel 1.0.1 (ruby)
2. mongrel 1.0.1 (mswin32)
3. mongrel 1.0.1 (ruby)
4. mongrel 1.0 (ruby)
5. mongrel 1.0 (mswin32)
6. Skip this gem
7. Cancel installation
> 2
Install required dependency gem_plugin? [Yn] Y
Successfully installed mongrel-1.0.1-mswin32
Successfully installed gem_plugin-0.2.2
Installing ri documentation for mongrel-1.0.1-mswin32...
Installing ri documentation for gem_plugin-0.2.2...
Installing RDoc documentation for mongrel-1.0.1-mswin32...
Installing RDoc documentation for gem_plugin-0.2.2...


У нас теперь вместо дефолтного WEBRick'a стоит Mongrel, конечно на данном этапе это ни какой роли не играет, но и не помешает :) запускается таким же образом :

ruby script/server


При установке я руководствовался сайтом Rails.Org.Ua

Шаг Первый : Как это установить о_О?

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

Для начала я пошёл на официальный сайт RubyOnRails, огляделся .. вполне так симпатишный сайтик :), ну да ладно о эстетике :). Нас интересует раздел Download.
На странице загрузки вас ожидает Ruby installer для Windows если ты виндузятник, ну а линуксоид и прочий неформал найдет для себя нужное в репозитарии сорцов :).

И так сам интерпретатор мы скачали, что делаем дальше .. судя странице Download нам нужно скачать Ruby Gems.

Ruby Gems это такая классная штуковина которая помогает нам скачивать всякие офигенные прибамбасины для нашего замечательного фреймворка :). Ну всякие там дополнения это как в Debian диструбутивах софтинка Apt-get благодоря которой вы можете скачивать пакеты для вашего линукса. Кстати говоря сравнивая это с apt-get так же стоит сказать, что apt-get качает пакеты, а ruby gems качает гемы ^_^ логично да?

И так я скачал Ruby Gems .. и уже давно установил Ruby через Windows Installer.
Следующий шаг будет распоковка Ruby Gems, в какую либо директорию. Для примера я распаковал всю эту радость в папку:

c:\rubygems\

Далее запустили cmd.exe и производим установку Ruby Gems:

ruby setup.rb

Если консоль сообщает, что ruby не найден .. то каким-то чудом переменные окружения у вас не работают глобально :) Не беда .. я с этим столкнулся и решил очень простым способом :) Топаем в свойство системы выбираем "дополнительно" и там кнопочка "Переменные среды". Так вот я обнаружил, что в системных переменных все прописалось, а в пользовательских нет, решается банальным переносом создаете в "Переменные среды пользователя *Имя_Пользователя* 3 переменные "PATHEXT" , "PATH" , "RUBYOPT" значения для которых берете из системных.

Ну вот ... гемы установились .. что теперь? стаил рельсы!! :)

gem install rails --include-dependencies

Вполне возможно случится такое, что используя эту команду зависимости такие как ActiveRecord , ActiveSupport не скачались, по-этому можно их скачать отдельно и в ручную


gem install activesupport
gem install actionpack
gem install actionmailer
gem install activerecord
gem install actionwebservice
gem install rake


И так ... что мы сделали .. в принципе мы сделали все, что нужно для того, чтобы безнаказанно создавать Rails приложения :) Мы же хотим их создавать ? Хотим!!!

И так для этого я себе создал еще одну директорию в корне диска и назвал её

c:\rails_apps\

К примеру .. с чего бы мне начать своё увлекательнейшее приключение с Ruby On Rails? Хмм.. обычно пытаются делать всякие блоги, wiki и прочую дребедень .. но мы ведь хотим научится использовать RubyOnRails! а не создавать блог ... блог я и wordpress создать могу :) Кстати хорошая альтернатива Wordpress'у в среде Ruby это MephistoBlog. И так, что я надумал? Да все гениальное просто .. я создаю себе приложение Test и буду просто тыкать, щупать, и наслаждаться возможностью Ruby On Rails и так поехали :)

c:\rails_apps\> rails Test

После чего у нас появится директория с приложением Test в котором нам нужно будет создавать свои контроллеры, модели, вьюшки вобщем все как в MVC :)

И так .. на этом мы закончим ... установить установили .. создать создали .. в след. посте будем придумывать себе задачки на Ruby On Rails ! ;)