Извините, что сообщаю, что это всего лишь одноразовый синтаксис, который на самом деле не имеет никакого отношения к другому синтаксису Ruby.
С учетом выражения:
begin
# ...
rescue FooError, BarError => ex
# ...
end
FooError, BarError
- список классов исключений (обычно подклассы StandardError
), которые будут спасены.Это ведет себя так же, как список аргументов, так что вы можете (если хотите) сделать что-то вроде этого:
my_exception_classes = [ FooError, BarError ]
begin
# ...
rescue *my_exception_classes => ex
# ...
end
Стоит отметить, что вы, как правило, не должны использовать Exception
здесь, потому что это спасет все исключения, включая такие вещи, как SignalException::Interrupt
и NoMemoryError
, которые обычно не то, что вы хотите .
=>
- это всего лишь синтаксис и, возможно, не лучший выбор синтаксиса, поскольку он приводит к таким вопросам, как ваш.
ex
- это имя локальной переменной, в которую будет помещен объект исключения.
Копание глубже
Если вы читаете грамматику синтаксического анализатора, это всегда интереснов грамматике YACC Руби в parse.y
.Это не особенно легко прочитать, но мы можем увидеть грамматику для выражения rescue
, называемого opt_rescue
в грамматике, здесь:
opt_rescue : k_rescue exc_list exc_var then
compstmt
opt_rescue
k_rescue
имеетконечно ключевое слово rescue
.exc_list
- это список классов исключений, который, как я уже сказал, аналогичен списку аргументов:
exc_list : arg_value
exc_var
- это часть, в которой указана переменная для помещения исключения:
exc_var : tASSOC lhs
И здесь tASSOC
- это, конечно, наш друг hashrocket (=>
), а lhs
, то есть «левая сторона», это выражение, которое вы найдете слева отвыражение присваивания (как, скажем, имя переменной).
compstmt
- это, по сути, «любой допустимый код Ruby», а затем снова есть opt_rescue
, поскольку вы можете (необязательно) иметь много rescues
в блоке begin
или def
.
Как видите, единственное, что этот синтаксис имеет общего с хэшем, это tASSOC
.