Какой синтаксис (=>) используется при присвоении объекта ошибки переменной метода спасения?
-
13-12-2019 - |
Вопрос
А rescue
который может назначить переменную для ссылки на объект ошибки, имеет этот синтаксис (=>
)
rescue => e
Если rescue
это один из вызовов общего метода, в чем смысл =>
.Могу ли я использовать тот же синтаксис при вызове другого метода?
my_method arg1, arg2 => my_obj
Решение
Пока raise
это действительно метод, rescue
не является.Это ключевое слово, определенное на синтаксический анализ.y:10467.Таким образом, ваш синтаксис является особенным для rescue
(с => e
это не какой-то вид метод аргумент), и недействителен для самих методов (по крайней мере, не имеет того же значения).Как/где rescue => e
сам синтаксис определен в парсере, я не совсем уверен.
Другие советы
Как мог бы сказать какой-нибудь футбольный тренер/король-философ, это то, что есть.Вот Руби синтаксический анализ.y.Особый интерес представляет эта часть:
opt_rescue : keyword_rescue exc_list exc_var then
compstmt
opt_rescue
...
| none
;
exc_list : arg_value
...
| mrhs
...
| none
;
exc_var : tASSOC lhs
...
| none
;
Объяснение
exc_list
в основном ничего не разрешает, тип исключения или (размеченную) серию исключений, например rescue ZeroDivisionError, LoadError
exc_var
может быть ничего или => some_variable
opt_rescue
поэтому может быть rescue
отдельно или плюс одно или оба из вышеперечисленных.
Его только перечислены здесь как специальный синтаксис для назначения исключений.Единственное другое применение для =>
для ассоциация «ключ-значение».
Обратите внимание также, что arg_value
и mrhs
находятся на левой стороне и lhs
находится с правой стороны, и это, насколько я могу судить, единственное место, где это происходит.Кто-нибудь поправит меня, если я ошибаюсь, но в parse.y нет другого «обратного» присваивания.
Нет, синтаксис в спасении используется только там.Если вы используете хеш-ракету «=>» в таком вызове функции, она будет интерпретирована как хэш, и если arg2 ранее не был определен как переменная, это будет ошибкой.
def foo(a,b)
puts b.inspect
end
foo "bar", :baz => 5 #=> {:baz=>5}
foo "bar", baz => 5 #=> NameError: undefined local variable or method `baz'
baz = "flux"
foo "bar", baz => 5 #=> {"flux"=>5}