将错误对象赋值给"救援"方法的变量时使用的语法(=>)是什么?
-
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
基本上什么都不允许,一个异常类型,或(splatted)一系列异常,如 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}
不隶属于 StackOverflow