首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >'=>‘的Ruby语法(哈希火箭)

'=>‘的Ruby语法(哈希火箭)
EN

Stack Overflow用户
提问于 2018-06-09 04:29:38
回答 1查看 518关注 0票数 6

我尝试了这个earlier,每个人都学到了救援块语法。请不要去那里,。给定以下工作代码:

代码语言:javascript
复制
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”。下面的代码同样可以正常工作。

代码语言:javascript
复制
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’)。

代码语言:javascript
复制
begin
  (1..1000).each do |i|
    puts i
    sleep 1
  end
rescue { Exception => b }
   puts "\nCaught exception..."
   puts "Exception class: #{b.class}"
end

有人能解释一下发生了什么吗?在这个特定的例子中,具体是什么语言元素'=>‘(哈希火箭),因为它似乎与哈希无关?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-09 05:00:43

我很遗憾地告诉您,这只是一次性语法,与其他Ruby语法没有任何关系。

给定表达式:

代码语言:javascript
复制
begin
  # ...
rescue FooError, BarError => ex
  # ...
end

  • FooError, BarError是将被拯救的异常类(通常是StandardError的子类)的列表。它的行为就像一个参数列表,所以你可以(如果你想的话)做这样的事情:

my_exception_classes = FooError,BarError begin # ...解救*my_exception_classes => ex # ...结束

值得注意的是,您通常不应该在这里使用Exception,因为它将挽救所有异常,包括SignalException::InterruptNoMemoryError之类的内容,而Exception只是一种语法,而且可以说不是最佳的语法选择,因为它会导致诸如您的own.

  • ex是将放入异常对象的局部变量的名称之类的问题。

更深层次的挖掘

如果您对解析器语法感兴趣,那么在parse.y中查看Ruby语法总是很有趣的。它不是特别容易阅读,但我们可以看到rescue表达式的语法,在语法中称为opt_rescue,如下所示:

代码语言:javascript
复制
opt_rescue  : k_rescue exc_list exc_var then
              compstmt
              opt_rescue

k_rescue当然是关键字rescueexc_list是异常类的列表,就像我说过的,它就像一个参数列表:

代码语言:javascript
复制
exc_list    : arg_value

exc_var是指定放置异常的变量的部分:

代码语言:javascript
复制
exc_var     : tASSOC lhs

这里,tASSOC当然是我们的朋友hashrocket (=>),而lhs,即“left -hand side”,是一个可以在赋值表达式(比如变量名)左边找到的表达式。

compstmt基本上是“任何有效的Ruby代码”,然后又是opt_rescue,因为您可以(可选地)在一个begindef块中包含许多rescues

正如您所看到的,这种语法与散列唯一的共同点是tASSOC

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50767991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档