среда, 10 марта 2010 г.

О Ruby и блоках кода


Нашёл сегодня любопытную статью на хабре. Прочитав её, лишний раз убедился что для объективного сравнения двух языков, знать нужно оба...


Пример исключительности блоков кода Ruby был такой:

class Example
  @@lock = Mutex.new
 
  def example
    @@lock.synchronize do
      # разные опасные штуки
    end
  end
end

Цитата:
"Важно отметить, что synchronize — это нормальный Ruby-метод. Оригинальная версия, написанная на чистом Ruby, выглядит следующим образом:"
def synchronize
  lock
  begin
    yield
  ensure
    unlock
  end
end

Тут же утверждалось что:
"Аналогично, Python требовал использование try/finally до версии Python 2.5, когда была добавлена специальная языковая функция для обработки идиомы try/finally. В случае 2.5, объект, переданный в with, должен реализовать специальный протокол (включая методы __enter__ и __exit__), поэтому выражение with не может быть использовано как общецелевые и легковесные блоки Ruby."

Вот тут то и сказывается неосведомлённость автора о библиотеке contextmanagerlib, входящей stdlib Python'а. С её помощью synchronize будет выглядеть как обычная функция:
@contextmanager
def synchronize():
    lock()
    try:
        yield
    finally:
        unlock()

Использование тривиально:
with synchronize():
    # some code


К чему я всё это? Python и Ruby два отличных языка, с своими достоинствами и недостатками, однако незнание некоторых вещей о языке при сравнении, не должно быть его недостатком.

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

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