Нашёл сегодня любопытную статью на хабре. Прочитав её, лишний раз убедился что для объективного сравнения двух языков, знать нужно оба...
Пример исключительности блоков кода 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 два отличных языка, с своими достоинствами и недостатками, однако незнание некоторых вещей о языке при сравнении, не должно быть его недостатком.
среда, 10 марта 2010 г.
О Ruby и блоках кода
Ярлыки:
программирование,
python
Подписаться на:
Комментарии к сообщению (Atom)
Комментариев нет:
Отправить комментарий