Какой синтаксис (=>) используется при назначении объекта ошибки переменной метода `rescue`? - PullRequest
7 голосов
/ 13 марта 2012

rescue, который может назначить переменную для ссылки на объект ошибки, имеет следующий синтаксис (=>)

rescue => e

Если rescue является одним из вызовов общего метода, в чем смысл=>.Могу ли я использовать тот же синтаксис при вызове другого метода?

my_method arg1, arg2 => my_obj

Ответы [ 3 ]

4 голосов
/ 13 марта 2012

Как сказал бы один футбольный тренер / философ-король, это то, что есть. Вот Ruby's parse.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 нет другого «обратного» назначения.

4 голосов
/ 13 марта 2012

Хотя raise действительно является методом , rescue - нет. Это ключевое слово и определено в parse.y: 10467 . Таким образом, у вас есть специальный синтаксис для rescue (поскольку => e не является каким-либо аргументом метода аргумента), и он недопустим для самих методов (по крайней мере, с тем же значением). Как / где сам синтаксис rescue => e определен в парсере, я не совсем уверен.

0 голосов
/ 13 марта 2012

Нет, синтаксис в спасении используется только там. Если вы используете хэш-ракету '=>' в таком вызове функции, он будет интерпретирован как хеш, а если 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}
...