‘=>’的Ruby语法(hashrocket)
我尝试了这个
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之间使用=>在…之间? “救援”这个词是关键词……ruby语言的一部分. “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 什么是“例外”和“=>”?还有另一种方法来编写这个表达式,使其从语法的角度来看更容易理解吗?我不认为我们在这里处理哈希,因为下面的代码编译但是只要按下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 有人可以解释发生了什么吗?具体是什么语言元素’=>’ (hashrocket)是在这个具体的例子,因为它似乎与哈希无关? 解决方法
我很遗憾地通知您,这只是一次性语法,与其他Ruby语法没有任何关系.
鉴于表达式: begin # ... rescue FooError,BarError => ex # ... end > FooError,BarError是将被拯救的异常类列表(通常是 my_exception_classes = [ FooError,BarError ] begin # ... rescue *my_exception_classes => ex # ... end 值得注意的是,你通常不应该在这里使用Exception,因为它会拯救所有异常,包括SignalException :: Interrupt和NoMemoryError等usually isn’t what you want. 深层发掘 如果您正在阅读解析器语法,那么在 opt_rescue : k_rescue exc_list exc_var then compstmt opt_rescue k_rescue当然是关键字救援. exc_list是异常类的列表,就像我说的那样,就像一个参数列表: exc_list : arg_value exc_var是指定放入异常的变量的部分: exc_var : tASSOC lhs 在这里,tASSOC当然是我们的朋友hashrocket(=>),而lhs,即“左手边”,是你在任务表达式左边找到的表达式(比如,名字,一个变量). compstmt基本上是“任何有效的Ruby代码”,然后再次有opt_rescue,因为你可以(可选)在begin或def块中有许多救援. 如您所见,此语法与Hash的唯一共同点是tASSOC. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |