我尝试了这个earlier,每个人都学到了救援块语法。请不要去那里,。给定以下工作代码:
begin
(1..1000).each do |i|
puts i
sleep 1
end
rescue Exception => e
puts "\nCaught exception..."
puts "Exception class: #{e.class}"
end
如预期的那样,在运行时按CTRL+C会打印出“捕获异常...”。在救援线上,语法明智的到底是怎么回事,特别是在Exception
和变量e
之间,中间有=>
?
“救援”这个词是个关键词...这是红宝石语言的一部分。"e“是一个变量,在功能上可以是"a”、"b“或"c”。下面的代码同样可以正常工作。
begin
(1..1000).each do |i|
puts i
sleep 1
end
rescue Exception => b
puts "\nCaught exception..."
puts "Exception class: #{b.class}"
end
什么是"Exception“和"=>"?有没有另一种方法来写这个表达式,使它从语法的角度更容易理解?我不认为我们在这里处理哈希,因为下面的代码会编译,但一旦按下CTRL+C就会抛出一个错误(未定义的局部变量或方法‘e’)。
begin
(1..1000).each do |i|
puts i
sleep 1
end
rescue { Exception => b }
puts "\nCaught exception..."
puts "Exception class: #{b.class}"
end
有人能解释一下发生了什么吗?在这个特定的例子中,具体是什么语言元素'=>‘(哈希火箭),因为它似乎与哈希无关?
发布于 2018-06-09 05:00:43
我很遗憾地告诉您,这只是一次性语法,与其他Ruby语法没有任何关系。
给定表达式:
begin
# ...
rescue FooError, BarError => ex
# ...
end
FooError, BarError
是将被拯救的异常类(通常是StandardError
的子类)的列表。它的行为就像一个参数列表,所以你可以(如果你想的话)做这样的事情:my_exception_classes = FooError,BarError begin # ...解救*my_exception_classes => ex # ...结束
值得注意的是,您通常不应该在这里使用Exception
,因为它将挽救所有异常,包括SignalException::Interrupt
和NoMemoryError
之类的内容,而Exception
只是一种语法,而且可以说不是最佳的语法选择,因为它会导致诸如您的own.
ex
是将放入异常对象的局部变量的名称之类的问题。更深层次的挖掘
如果您对解析器语法感兴趣,那么在parse.y
中查看Ruby语法总是很有趣的。它不是特别容易阅读,但我们可以看到rescue
表达式的语法,在语法中称为opt_rescue
,如下所示:
opt_rescue : k_rescue exc_list exc_var then
compstmt
opt_rescue
k_rescue
当然是关键字rescue
。exc_list
是异常类的列表,就像我说过的,它就像一个参数列表:
exc_list : arg_value
exc_var
是指定放置异常的变量的部分:
exc_var : tASSOC lhs
这里,tASSOC
当然是我们的朋友hashrocket (=>
),而lhs
,即“left -hand side”,是一个可以在赋值表达式(比如变量名)左边找到的表达式。
compstmt
基本上是“任何有效的Ruby代码”,然后又是opt_rescue
,因为您可以(可选地)在一个begin
或def
块中包含许多rescues
。
正如您所看到的,这种语法与散列唯一的共同点是tASSOC
。
https://stackoverflow.com/questions/50767991
复制相似问题