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