Основы

RubyDev Ruby Tutorial #1 > Введение в Ruby

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

Предупреждение: Я не являюь профессиональным программистом, я любитель постигающий эту науку и желающий систематизировать свои знания путем написания учебника. Я стараюсь сделать его максимально полным и подробным, более качественным, чем все, что уже имеются. Создавая данный учебник я руководствуюсь своими личными соображениями о том, как он должен быть устроен и что в него должно быть включено. Если вам не нравится структура или изложение материала — просто не читайте, практика показывает, что это очень эффективный способ избежать болей ниже спины. Буду благодарен доброжелательной критике конкретно содержания, так как я не все знаю и даже в том, что знаю, могу заблуждаться.

Эта глава вводная, философская, совсем не практичная, однако очень важная. Она даст вам базовое представление о языке Ruby.

Философско-исторический аспект
Практический аспект
Установка Ruby
Кратко об элементах программного кода
Некоторые особенности Ruby Read the rest of this entry »

Tags: ,

&& и || vs AND и OR

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

Статья была признана некоректной и отредактирована! Большая благодарность комментаторам, в частности dre3k

До момента написания предыдущего поста, я и не знал, что && и and чем-то отличаются. В комментариях к предыдущему посту я узнал,что отличия существуют, и как оказывается достаточно значительные.

Что за различия?
&& и AND, || и OR одного поля ягоды, они выполняют абсолютно одинаковую функцию, однако имеют такое, несколько скрытое различие, как приоритет выполнения или старшинство. && и || имеют приоритет выше, чем AND и OR и именно на этом различии основываются все особенности работы с каждым из операторов. Давайте рассмотрим как же приоритет выполнения влияет на работу программы:

nil and a || b соответствует nil and (a || b) и мы получим nil
nil && a || b соответствует (nil and a) || b и мы получим b

Еще примеры:

c = 5 and 10 #=> 10
c #=> 5

Данное выражение соответствует выражению: (c = 5) && 10, поскольку у  and приоритет ниже, чем у «=».

c = 5 && 10 #=> 10
c #=> 10

Данное выражение соответствует выражению: с = (5 && 10) , поскольку у && приоритет выполнения выше, чем у «=»

Оператор and можно представить как постфиксный if:

puts "Hello!" if name == "Vladimir!"

идентично:

name == "Vladimir" and puts "Hello!"

Последовательность из OR можно представить как цепочку из «если здесь провал — попробуй это, если и здесь провал — пропробуй это, …», пример:

percent = 30
percent >= 51 or percent = 52

- примерно такой механизм использовали, на последних выборах в Украине.

В Perl и PHP существует такая идиома, как:

do_comthing or die do_something_else

Эту идиому можно реализовать в Ruby не только через unless, но и через or.

От куда взять все эти приоритеты операторов?

Tags:

Ruby и крассивый код #5: Рекомендации по стилю

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

samurai
Сегодня немного налажал с кодом и решил написать статью так сказать для закрепления представлений о хорошем коде в голове, ну и разумеется для того, чтобы поделиться имеющимися бедными познаниями с другими новичками. Более-менее опытным разработчикам все это уже, наверняка, известно, поэтому, если вы себя таковым считаете — можете не читать.
Read the rest of this entry »

Tags: , ,

Ruby’новые методы define_method, method_missing и instance_eval

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

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

Ruby’новые методы define_method, method_missing и instance_eval

Одной из вещей, которые мне так нравятся в Ruby есть то, что Ruby очень похож на Lisp. Конечно, Ruby не имеет полноты макросов, но он облает набором абсолютно крутецких методов, которые позволяют сокращать ваш код и делать ваши программы более легкоподдерживаемыми. Три метода, которые я реально обожаю это: define_method, method_missing и instance_eval. В этой статье я хочу подробно рассказать о них.
Read the rest of this entry »

Tags: , ,

Пишем расширение на Си для Ruby, ч. 1

февраля 5, 2011  |  Published in Ruby, Основы, Расширения, Си и C++

rubyПишем расширение на Си для Ruby, ч. 1
Пишем расширение на Си для Ruby, ч. 2

Вчера на почтовый ящик мне пришло письмо от читателя блога RubyDev , к которому был приложен перевод понравившейся ему статьи авторства небезызвестного в Ruby сообществе (известного также под псевдонимом tenderlove). Большое спасибо Василию за приложенные усилия и за помощь!

А теперь собственно статья:

Мне нравится писать расширения для Ruby на C. В этом цикле статей мы разберемся, как это делать. Я раскрою такие темы, как создание рабочего окружения для написания расширения, TDD, отладку, взаимодействие со сборщиком мусора, кросс-компиляцию для windows и т.д.

К концу серии постов мы должны написать расширение, которое будет оберткой для libstree. libstree - это реализация суффиксного дерева на C.

В этой части мы подготовим все, что нам нужно для разработки, изучим шаблон обычного расширения на C и реализуем наш первый метод на C. Естественно, все это мы будем делать используя TDD и autotest.
Read the rest of this entry »

Tags: , , ,

Кое-что о модуле ObjectSpace в Ruby

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

rubyRuby и ObjectSpace

В Ruby существует такой магический модуль как ObjectSpace. Он содержит весьма интересные, но редко применяемые методы, о которых и пойдет речь в этой статье.

Метод ObjectSpace.each_object

ObjectSpace.each_object это наверное самый полезный и самый используемый метод из всех методов, которые содержатся в ObjectSpace. Могущество этого метода заключается в том, что он позволяет в реальном времени редактировать объекты, причем это можно делать не с каким-либо определенным объектом, а со всем множеством экземпляров определенного класса.


class Blog

  attr_accessor :blog, :link, :author

  def initialize (blog, link, author)
    @blog   = blog
    @link   = link
    @author = author
  end

  def self.find_blog_by_author_name(aname)
    blog = false
    ObjectSpace.each_object(Blog) do |b|
      b.author == aname ? blog = b : blog
    end

    return blog
  end
end

rubydev = Blog.new('RubyDev', 'http://rubydev.ru', 'Vladimir Melnik')
rubyinside = Blog.new('RubyInside', 'http://rubyinside.com', 'Peter Cooper')
ykblog = Blog.new('Yehuda\'s blog', 'http://yehudakatz.com', 'Yehuda Katz' )

fblog  =  Blog.find_blog_by_author_name('Vladimir Melnik')

Теперь в переменной fblog у нас содержится та ссылка на тот же объект, что и в переменной rubydev. Read the rest of this entry »

Tags: , ,

Символы в Ruby

января 25, 2011  |  Published in Ruby, Основы

Еще раньше хотел написать эту статью, но забывал об этой своей идее. Сегодня вспомнил благодаря письму, пришедшему мне на email в котором меня попросили написать о том, что такое Символ в Ruby, где он используется и т.д. В общем пишу…

В интернетах наталкивался на несколько объяснений о том, что собой являют символы в Ruby. Все они начинали так: «Символ в Ruby — это экземпляр класса Symbol»… Ну да, символ — экземпляр класса Symbol, однако что нам это дает?

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

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

ruby symbol

Как видно из примера было создано два массива состоящих из хэшей. Единственное отличие между ними, это то, что в хэшах составляющих первый массив в качестве ключей используются строки, а во втором — символы. Мы также видим, что в первом случае было создано 4объекта — ключа, а во втором только два. Но почему так?
Read the rest of this entry »

Tags: ,

Магия модуля Enumerable в Ruby: #6 Сладкие остатки

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

enumerating ruby enumerable
Статьи из цикла Магия модуля Enumerable:

1.Основы
2. Унарный оператор амперсанд “&”
3. Условные операторы
4. Фильтры
5. Создание новых коллекций
6. Методы inject, min и max

Я не смог понять смысла и отношения оригинального названия статьи Aggregates, поэтому назвал статью просто «Методы inject, min и max».
Это последняя статья в цикле статей о модуле Enumerable и методах, которые он в себе содержит и которые позволяют очень удобно работать с коллекциями. В этой статье мы поговорим о методах, которые не возвращают новую коллекцию, а возвращают лишь один объект. Read the rest of this entry »

Tags: , ,

Магия модуля Enumerable в Ruby: #5 Создание новых коллекций

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

enumerating ruby enumerable
Статьи из цикла Магия модуля Enumerable:
1.Основы
2. Унарный оператор амперсанд “&”
3. Условные операторы
4. Фильтры
5. Создание новых коллекций
6. Методы inject, min и max

Модуль Enumerable предлагает программисту несколько методов для создания новых коллекций из уже существующих выполняя блок кода для каждого элемента родительской коллекции.

Метод map

Это самый простой и часто используемый метод модуля Enumerable. Этот метод создает оригинальную коллекцию применяя переданный блок кода к каждому элементу внутри и возвращает массив результатов:

['joshua', 'gabriel', 'jacob'].map{|name| name.capitalize} #=> ["Joshua", "Gabriel", "Jacob"]
['joshua', 'gabriel', 'jacob'].map(&:capitalize) #=> ["Joshua", "Gabriel", "Jacob"]

Метод map нуждается в блоке кода, который вы можете передать непосредственно как блок или использовать технику с унарным амперсандом, о которой мы уже говорили во второй статье из цикла Магия модуля Enumerable. Read the rest of this entry »

Tags: , ,

Магия модуля Enumerable в Ruby: #4 Фильтры

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

enumerating ruby enumerable
Статьи из цикла Магия модуля Enumerable:
1.Основы
2. Унарный оператор амперсанд “&”
3. Условные операторы
4. Фильтры
5. Создание новых коллекций
6. Методы inject, min и max

Наиболее мощная часть модуля Enumerable — это набор методов, который направлен на помощь вам при фильтрации огромных коллекций для получения более малких коллекции содержащих те элементы, которые вам необходимы.

Метод entries (или to_a)

Не смотря на то, что я пишу об этом методе в статье о методах для фильтрации коллекции,метод entries ничего не фильтрует. Если вы примените этот метод для массива, то вы ничего не заметите. entries возвращает список элементов в коллекции, а для массива будет возвращен собственно сам массив. Вы навеняка сталкивались с этим методом посредствам его псевдонима — метода to_a. Однако, в случае работы с более сложными коллекциями, как, например, наш класс Team, метод entiries будет иметь больший смысл. Ниже представлен класс Team, с которым мы будем работать:

class Team
  include Enumerable

  attr_accessor :members

  def initialize
    @members = []
  end

  def each &block
    @members.each{|member| block.call(member)}
  end
end

Давайте поэкспериментируем с методом entries:

team = Team.new
team.members = ['joshua', 'gabriel', 'jacob']
team #=> #
team.entries #=> ["joshua", "gabriel", "jacob"]

Вы видите, что team является коллекцией, но при этом не является массивом, однако благодаря методу entries мы получаем представление коллекции в виде массива — списка участников. Честно говоря, все это не очень полезно, но хорошо знать, что такой метод существует и знать как он работает.

Read the rest of this entry »

Tags: , ,