Tips&Tricks — Безболезненное расширение классов ядра

июля 21, 2012  |  Published in Ruby, Tips&Tricks, Расширения

Говорят, что расширение классов ядра (monkey-patching) — это зло. Тут еще некоторые ведут споры касательно того, что считать monkey-patching’ом — добавление новых методов или переопределение старых, но мы обойдем этот спор стороной и сконцентрируемся на том, как это делать безболезненно.
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: , ,

Кое-что о модуле 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: , ,