суббота, 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

Комментариев нет:

Отправить комментарий