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