rescue
which 可以分配一个变量来引用错误对象具有这种语法( =>
)
rescue => e
如果rescue
是通用方法调用之一, . 的含义是什么=>
?我可以在其他方法调用上使用相同的语法吗?
my_method arg1, arg2 => my_obj
rescue
which 可以分配一个变量来引用错误对象具有这种语法( =>
)
rescue => e
如果rescue
是通用方法调用之一, . 的含义是什么=>
?我可以在其他方法调用上使用相同的语法吗?
my_method arg1, arg2 => my_obj
虽然raise
确实是一种方法,rescue
但不是。它是一个关键字,在parse.y:10467上定义。因此,您拥有的语法是特殊的rescue
(因为=> e
不是任何类型的方法参数),并且对方法本身无效(至少具有相同的含义)。rescue => e
我不完全确定语法本身在解析器中的定义方式/位置。
正如一些足球教练/哲学家国王可能会说的那样,它就是这样。这是 Ruby 的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
andmrhs
位于左侧和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}