рубиновый ловкость и эффективность

catch в Ruby предназначен для выхода из глубоко вложенного кода. Например, в Java того же можно добиться с помощью try-catch Java, предназначенного для обработки исключений, однако это считается плохим решением и также очень неэффективно. В Ruby для обработки исключений у нас есть begin-raise-rescue, и я предполагаю, что использовать его для других задач также слишком дорого.

Действительно ли Ruby catch-throw более эффективное решение, чем begin-raise-rescue, или есть какие-то другие причины использовать его для разбиения вложенных блоков вместо begin-raise-rescue?


person wrzasa    schedule 20.11.2012    source источник
comment
Если вы опубликуете несколько рубиновых примеров структур управления, о которых вы спрашиваете, может быть более ясно, что вы имеете в виду.   -  person Alex Wayne    schedule 21.11.2012


Ответы (2)


catch-throw не только является «правильным» способом выхода из-под контроля структур, он также значительно быстрее (в 10 раз быстрее в моем тестировании). Ознакомьтесь с этой сутью, чтобы узнать о моем коде и результатах.

person Josh    schedule 21.11.2012
comment
Спасибо! Тест действительно решает проблему (в моем случае почти 15 раз!). Следует ли считать бросок-бросок структурным стилем программирования - лучшей практикой, чем презираемый goto? - person wrzasa; 21.11.2012
comment
Это ваш дизайн требует ловкости, наверное, есть дизайн получше. При этом определенно есть крайние случаи, когда бросок catch имеет большой смысл, особенно в разработке драгоценных камней, где вы не знаете, как конечный пользователь будет его использовать. - person Josh; 22.11.2012
comment
Спасибо за все объяснения! - person wrzasa; 23.11.2012

Ответ Джоша правильный. Я хочу добавить дополнительную информацию о catch-throw и raise-rescue.

catch-throw используется для управления потоком, тогда как raise-rescue используется для обработки исключений / ошибок. Другое: backtrace не требуется для catch-throw (управление потоком). Поверьте мне, основная причина того, что raise-rescue работает медленнее, чем catch-throw в 10 раз в Суть Джоша, raise-rescue занимает много времени время создать backtrace объект.

Если вы хотите raise без трассировки, используйте синтаксис:

raise <type>, <message>, <backtrace>

Ознакомьтесь с моей сутью. raise without backtrace намного быстрее, чем raise with backtrace.

Обновление за апрель 2016 г .:

Я обновил свою суть:

  • Фиксированный тест на «разрыв»
  • Добавлены результаты тестов производительности для новой версии Ruby 2.1.8, 2.2.4, 2.3.0.
person Jacob Dam    schedule 26.06.2013