微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

‘=>’的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是将被拯救的异常类列表(通常是StandardError的子类).这个行为就像一个参数列表,所以你可以(如果你愿意)做这样的事情:

my_exception_classes = [ FooError,BarError ]

begin
  # ...
rescue *my_exception_classes => ex
  # ...
 end

值得注意的是,你通常不应该在这里使用Exception,因为它会拯救所有异常,包括SignalException :: Interrupt和NoMemoryError等usually isn’t what you want.
> =>只是语法,可以说它不是语法的最佳选择,因为它会导致像你自己这样的问题.
> ex是将放置异常对象的局部变量的名称.

深层发掘

如果您正在阅读解析器语法,那么在parse.y中查看Ruby的YACC语法总是很有趣.它不是特别容易阅读,但是我们可以在语法中看到救援表达式的语法,称为opt_rescue,这里:

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.

原文地址:https://www.jb51.cc/ruby/264721.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐