Показаны сообщения с ярлыком Ruby. Показать все сообщения
Показаны сообщения с ярлыком Ruby. Показать все сообщения

пятница, 4 июня 2010 г.

Ruby ч.3 Работа с объектами в Ruby

Продолжение этой статьи.
Итак, у нас уже объявлен класс Greeter. Посмотрим на него в действии:
irb(main):035:0> g = Greeter.new("Pat")
=> #
irb(main):036:0> g.say_hi
Hi Pat!
=> nil
irb(main):037:0> g.say_bye
Bye Pat, come back soon.
=> nil
Итак, как вы видите, все работает, как задумано. Что же будет, если мы попытаемся обратиться к имени напрямую?
irb(main):038:0> g.@name
SyntaxError: compile error
(irb):52: syntax error
from (irb):52
Ага, он ругается.
Переменные класса всегда спрятаны от посторонних глаз. Спрятаны они не насовсем, вы можете их найти, когда инспектируете объект, и всякими другими способами. Однако Ruby придерживается объектно-ориентированного подхода по отношению к скрытию переменных.
Посмотрим, какие же методы существуют у объекта класса Greeter:
irb(main):039:0> Greeter.instance_methods
=> ["method", "send", "object_id", "singleton_methods",
"__send__", "equal?", "taint", "frozen?",
"instance_variable_get", "kind_of?", "to_a",
"instance_eval", "type", "protected_methods", "extend",
"eql?", "display", "instance_variable_set", "hash",
"is_a?", "to_s", "class", "tainted?", "private_methods",
"untaint", "say_hi", "id", "inspect", "==", "===",
"clone", "public_methods", "respond_to?", "freeze",
"say_bye", "__id__", "=~", "methods", "nil?", "dup",
"instance_variables", "instance_of?"]
Ого! Но ведь мы объявляли всего два метода, откуда же их столько?
Здесь перечислены все методы класса Greeter, в том числе и унаследованные от его предка. А теперь посмотрим методы, присущие только классу Greeter:
irb(main):040:0> Greeter.instance_methods(false)
=> ["say_bye", "say_hi"]
А теперь посмотрим, на какие методы откликается наш объект:
irb(main):041:0> g.respond_to?("name")
=> false
irb(main):042:0> g.respond_to?("say_hi")
=> true
irb(main):043:0> g.respond_to?("to_s")
=> true
Итак, как мы видим, Greeter не знает метода name.
Однако, что будет, если мы захотим увидеть или изменить name? Ruby предоставляет легкий способ для доступа к переменным класса:
irb(main):044:0> class Greeter
irb(main):045:1> attr_accessor :name
irb(main):046:1> end
=> nil
В Ruby всегда можно открыть класс заново и изменить его свойства. Итак, попробуем создать новый экземпляр класса Greeter и поиграть с свойством @name:
irb(main):047:0> g = Greeter.new("Andy")
=> #
irb(main):048:0> g.respond_to?("name")
=> true
irb(main):049:0> g.respond_to?("name=")
=> true
irb(main):050:0> g.say_hi
Hi Andy!
=> nil
irb(main):051:0> g.name="Betty"
=> "Betty"
irb(main):052:0> g
=> #
irb(main):053:0> g.name
=> "Betty"
irb(main):054:0> g.say_hi
Hi Betty!
=> nil
Действие :attr_accessor создало для нас 2 новых метода, name для получения значения переменной @name и name= для задания ее значения.
Однако, Greeter сейчас умеет приветствовать и прощаться только с одним человеком. Что, если нам захочется создать некий MegaGreeter, который сумел бы приветствовать весь мир, одного человека, или несколько человек сразу?
Давайте напишем следующие строки в отдельном файле, а не прямо в интерпретаторе:
#!/usr/bin/env ruby

class MegaGreeter
attr_accessor :names

# Create the object
def initialize(names = "World")
@names = names
end

# Say hi to everybody
def say_hi
if @names.nil?
puts "..."
elsif @names.respond_to?("each")

# @names is a list of some kind, iterate!
@names.each do |name|
puts "Hello #{name}!"
end
else
puts "Hello #{@names}!"
end
end

# Say bye to everybody
def say_bye
if @names.nil?
puts "..."
elsif @names.respond_to?("join")
# Join the list elements with commas
puts "Goodbye #{@names.join(", ")}. Come back soon!"
else
puts "Goodbye #{@names}. Come back soon!"
end
end

end


if __FILE__ == $0
mg = MegaGreeter.new
mg.say_hi
mg.say_bye

# Change name to be "Zeke"
mg.names = "Zeke"
mg.say_hi
mg.say_bye

# Change the name to an array of names
mg.names = ["Albert", "Brenda", "Charles",
"Dave", "Englebert"]
mg.say_hi
mg.say_bye

# Change to nil
mg.names = nil
mg.say_hi
mg.say_bye
end
Сохраним этот файл как "ri20min.rb", а затем выполним командой "ruby ri20min.rb":
Hello World!
Goodbye World. Come back soon!
Hello Zeke!
Goodbye Zeke. Come back soon!
Hello Albert!
Hello Brenda!
Hello Charles!
Hello Dave!
Hello Englebert!
Goodbye Albert, Brenda, Charles, Dave, Englebert. Come
back soon!
...
...
В следующей статье мы рассмотрим еще массу интересных действий!

Ruby ч.2: Продолжаем изучать Ruby

Как продолжение этой статьи, вольный перевод кусочка руководства Ruby за 20 минут.
Как заставить Ruby приветствовать нас, не напрягая при этом наши пальцы? Очень просто, надо всего лишь объявить метод, который будет это делать:
irb(main):010:0> def h
irb(main):011:1> puts "Hello World!"
irb(main):012:1> end
=> nil
Код "def h" обозначает собой объявление метода. Им мы говорим Ruby, что объявляем метод с именем h. Строка "end" означает, что мы закончили объявление метода. Между этими строками находится тело метода, то есть то, что он будет делать. В данном случае - говорить "Hello World!". Фраза "nil", которой ответил нам интерпретатор, означает, что он понял, что мы закончили объявление.
Итак, попробуем запустить этот метод пару раз:
irb(main):013:0> h
Hello World!
=> nil
irb(main):014:0> h()
Hello World!
=> nil
Видите, как это просто? Вызвать метод настолько же легко, как сказать его имя Ruby. Если метод не требует параметров, то это все, что вам нужно. Однако, если вы хотите, то вы можете добавить пустые круглые скобки.
Что, если мы захотим говорить "Привет" какому-то определенному человеку, а не целому миру сразу? Достаточно всего лишь переопределить этот метод так, чтобы они принимал имя, как параметр:
irb(main):015:0> def h(name)
irb(main):016:1> puts "Hello #{name}!"
irb(main):017:1> end
=> nil
irb(main):018:0> h("Matz")
Hello Matz!
=> nil
Итак, это работает. Однако, попробуем посмотреть, как это работает.
Для начала, что такое "#{name}"? Это способ вставить что либо в строку в Ruby. Данные, находящиеся в переменной, указанной в фигурных скобках, преобразуются в строку (если они уже ей не были), а затем вставляются во внешнюю строку в том самом месте, где мы написали это выражение. Так же мы можем реализовать проверку того, написано ли имя с большой буквы:
irb(main):019:0> def h(name = "World")
irb(main):020:1> puts "Hello #{name.capitalize}!"
irb(main):021:1> end
=> nil
irb(main):022:0> h "chris"
Hello Chris!
=> nil
irb(main):023:0> h
Hello World!
=> nil
Рассмотрим, что тут происходит:
Если мы вызываем метод без скобок или не указываем параметр, то в качестве name используется параметр по умолчанию, то есть "World". В противном случае, первая буква имени делается заглавной, и выводится приветственное сообщение.
Ну а если же мы хотим создать реального привратника, который будет запоминать наше имя и встречать и провожать нас, то, возможно, стоит создать объект:
irb(main):024:0> class Greeter
irb(main):025:1> def initialize(name = "World")
irb(main):026:2> @name = name
irb(main):027:2> end
irb(main):028:1> def say_hi
irb(main):029:2> puts "Hi #{@name}!"
irb(main):030:2> end
irb(main):031:1> def say_bye
irb(main):032:2> puts "Bye #{@name}, come back soon."
irb(main):033:2> end
irb(main):034:1> end
=> nil
Здесь появляется новое ключевое слово - "class". Оно означает, что мы создаем новый класс Greeter и несколько методов для него. Также вы наверняка заметили "@name" - это переменная, доступная всем методам класса. Как вы видите, она используется методами say_hi и say_bye. Рассмотрим это в действии в следующей статье.

среда, 2 июня 2010 г.

RoR: связываем Ruby on Rails и Apache2

Про то, как установить Ruby On Rails, я писал в этой статье. Теперь же постараюсь описать, как запускать ROR-приложения под Apache2.
Итак, приступим.

вторник, 1 июня 2010 г.

Установка Ruby On Rails на Linux Debian (Ubuntu)

Расскажу о том, как ставить  фреймворк Ruby On Rails на Linux Debian (В случае с Ubuntu действия аналогичны).
Установка Ruby
а) Из репозитория:
sudo apt-get install ruby-full build-essential
б) Из исходников
Во-первых, надо установить пакеты, которые потребуются при компиляции:
sudo apt-get install build-essential libssl-dev libreadline5-dev zlib1g-dev
Затем скачиваем исходники в тарболе:
wget ftp://ftp.ruby-lang.org/pub/ruby/stable-snapshot.tar.gz
Распаковываем тарбол:
tar xzf stable-snapshot.tar.gz
Компилируем и устанавливаем:
$ cd ruby/
./configure
make
sudo make install
Проверяем работоспособность Ruby:
ruby -v
Должно появиться сообщение, подобное этому:
ruby 1.8.7p5000 (2009-02-22) [i686-linux]
Проверяем работоспособность библиотек:
ruby -ropenssl -rzlib -rreadline -e "puts :Hello"
В результате на экране должно появится следующее:
Hello
Установка RubyGems 
Установка через репозиторий:
Для этого необходимо выполнить следующую команду:
sudo apt-get install rubygems
Разработчки Rails не рекомендуют так делать. По их мнению, лучше устанавливать из исходников.
Установка RubyGems из исходников:
Для этого надо выполнить следующие действия:
$ cd ~
wget http://rubyforge.org/frs/download.php/45905/rubygems-1.3.2.tgz
tar xzvf rubygems-1.3.2.tgz
cd rubygems-1.3.2
sudo ruby setup.rb
sudo ln -s /usr/bin/gem1.8 /usr/bin/gem
Установка Rails
Установка с помощью RubyGems:
Это самый простой способ установить Rails. Для этого надо выполнить команду:
sudo gem install rails
В Ubuntu Karmic RubyGems устанавливает Rails не корректно, в этом случае можно воспользоваться установкой из репозитория через apt-get или aptitude
Установка из репозитория:
sudo apt-get install rails

понедельник, 31 мая 2010 г.

Ruby On Rails: Что это?

Итак, начнем знакомиться с Ruby On Rails.
Во-первых, открываем getting started и читаем:
Что такое Rails?
Rails - это фреймворк для разработки веб-приложений, написанный на языке Ruby. Он предназначен для облегчения программирования за счет допущений относительно того, что нужно каждому разработчику. Это приводит к тому, что программировать требуется намного меньше по сравнению с другими языками и фреймворками.
Rails делает предположение, что существует некий "лучший" путь разработки, и спроектирован таким образом, чтобы следовать этому пути. Как обещают разработчики, если мы выучим "путь Rails", то невероятно увеличим свою производительность. Если же попытаться применять какие-то другие пути к Rails, то ничего хорошего из этого не выйдет.
Философия Rails включает в себя несколько главных приципов:
1) DRY – “Don’t Repeat Yourself” - "Не повторяйтесь" - подразумевает, что писать один и тот же код снова и снова - плохо.
2) Convention Over Configuration - Соглашения превыше конфигурации - Rails делает предположения о том, что вы хотите сделать, и как, вместо того, чтобы заставлять вас править бесконечные файлы конфигурации.
3) REST - лучший подход для разработки веб-приложений. Организация приложения на стандартных возможностях http - лучший способ сделать дело.

суббота, 29 мая 2010 г.

Ruby ч1: Hello World, или знакомство с Ruby.

Захотелось мне узнать, что же за зверь такой фреймворк ROR. Но для того, чтобы это узнать, надо разобраться сначала с самим Ruby, как он хоть выглядит в принципе и как на нем писать:)
Итак, поехали.
У меня имеется тестовая виртуальная машина с Linux Debian.
Необходимо установить на нее Ruby. Для этого выполняем следующую команду:
aptitude install ruby libzlib-ruby rdoc irb
Что же мы ставим? Ruby - это сам язык ruby, libzlib-ruby - библиотека zlib для ruby, rdoc - инструмент для генерации документации на основе документов ruby, irb - коммандная строка ruby.
Когда все это установится, можно проверить работу ruby так, как написано здесь. Например, можно использовать Ruby как калькулятор:
irb(main):007:0> a = 3 ** 2
=> 9
irb(main):008:0> b = 4 ** 2
=> 16
irb(main):009:0> Math.sqrt(a+b) => 5.0
Или взглянем на то, как в Ruby определяются методы:
irb(main):010:0> def h
irb(main):011:1> puts "Hello World!"
irb(main):012:1> end
=> nil
Здесь мы определили метод h, который при своем вызове будет выводить на экран фразу "Hello World!",
Чтобы вызвать этот метод, достаточно всего лишь ввести h:
irb(main):013:0> h
Hello World!
=> nil
irb(main):014:0> h()
Hello World!
=> nil
На этом совсем предварительное знакомство с Ruby закончим. Если понадобится (а я уверен, что понадобится), то вернемся к этому в следующих статьях:)