воскресенье, 16 декабря 2012 г.

RDot v0.9.6

  • Пофиксил очередные проблемы, которые всплывали при использовании Ruby 1.9.3, вроде бы осталось только невнятное предупреждение... Которое, скорее всего доживет до полной переработки программы, до которой, в свою очередь, фиг знает, когда руки дойдут.
  • Добавил ключик, позволяющий указать пути поиска для require.

Взять, как и прежде, можно с GitHub'а или BitBucket'а.

суббота, 15 декабря 2012 г.

Снова о странном поведении

Вкратце: super всегда получает блок, заданный при вызове метода потомка, даже если явно указаны аргументы без него. На примере:

class Alpha

  def initialize name, &block
    @name = name
    if block_given?
      self.instance_eval &block
    end
  end

end

class Beta < Alpha

  def initialize name, family, &block
    super(name)
    @family = family
    if block_given?
      self.instance_eval &block
    end
  end

end

b = Beta.new 'John', 'Bull' do
  p self
end

Выдаст примерно следующее:

#<Beta:0x00000001733560 @name="John">
#<Beta:0x00000001733560 @name="John", @family="Bull">

Т.е. сначала блок отрабатывает в super, а затем в непосредственном методе... И что-то мне это не нравится.

upd: Да, явное указание пустого блока помогает:

super(name) do
end

пятница, 7 декабря 2012 г.

Just for Fun: «ленивые» и параллельные вычисления для Ruby

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

Спасибо Ruby 1.9 за класс BasicObject — перекрывать всю массу методов Object я бы поленился.

Брать с ГитХаба — https://github.com/shikhalev/lazy.

upd: Проект перенесен, см. пост от 2013-04-18.

вторник, 4 декабря 2012 г.

Блоки и управление потоком в Ruby 1.9

Захотелось сделать некоторое обобщение по теме управления потоком выполнения в Ruby. Вся необходимая информация есть в документации, но несколько размазана по описаниям различных конструкций. А я попробую кратенько и плотно изложить именно этот аспект.

Дело в том, что Ruby — очень гибкий язык, а где гибкость, там и неочевидные тонкости...