Какой синтаксис (=>) используется при присвоении объекта ошибки переменной метода спасения?

StackOverflow https://stackoverflow.com//questions/9686991

Вопрос

А 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}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top