【问题标题】:What does the "=>" in "rescue Exception => e" do?“rescue Exception => e”中的“=>”有什么作用?
【发布时间】:2013-01-01 15:32:16
【问题描述】:

举个例子:

def method_of_doom
my_string = "I sense impending doom."
my_string.ah_ha_i_called_a_nonexistent_method
rescue NoMethodError => e:
puts "PROBLEM: " + e.to_s
rescue Exception:
puts "Uhh...there's a problem with that there method."
end

在上面写着的那一行:

rescue NoMethodError => e:

“=>”在做什么?

它与这种用法有何不同:

module FighterValues
BAMBOO_HEAD = { 'life' => 120, 'hit' => 9 }
DEATH = { 'life' => 90, 'hit' => 13 }
KOALA = { 'life' => 100, 'hit' => 10 }
CHUCK_NORRIS = { 'life' => 60000, 'hit' => 99999999 }

def chuck_fact
puts "Chuck Norris' tears can cure cancer..."
puts "Too bad he never cries."
end
end

module ConstantValues
DEATH = -5 # Pandas can live PAST DEATH.
EASY_HANDICAP = 10
MEDIUM_HANDICAP = 25
HARD_HANDICAP = 50
end

puts FighterValues::DEATH
→ {'life'=>90,'hit'=>13}

puts ConstantValues::DEATH
→ -5

【问题讨论】:

  • 请养成缩进习惯。
  • 所有这些例子都来自:humblelittlerubybook.com/book/html/index.html
  • 你不应该这样做 rescue Exception - Exception 可能包含非常严重的错误。 (不是批评你,只是教程的作者)。

标签: ruby syntax rescue hashrocket


【解决方案1】:

有一堆good links on the Ruby Info page

这取决于上下文。

rescue 的上下文中,它意味着:

“将异常对象赋值给变量e。”

这样以后就可以用作e.to_s了。

在哈希字面量中它的意思是:

一对,由 key=>value 表示。

这是由两对创建的哈希文字:{:name => "Fred", :age => 20}

(Ruby 1.9/2.0+ 还允许{name: "Fred", age: 20} 语法,其中nameage 指的是符号。)

在字符串中,就是这样:

"=>哇!"。

在这种情况下,puts FighterValues::DEATH 等价于 puts FighterValues::DEATH.to_s。也就是说,显示的输出来自一个字符串。考虑一下:puts "{a => b}"

【讨论】:

  • 谢谢,我找到了一个很好的解释哈希文字的来源:ruby-doc.org/docs/ProgrammingRuby/html/intro.html
  • 当 StackOverflow 允许我时,我会在大约 5 分钟内接受你的回答 :)
  • 所以在 BAMBOO_HEAD = { 'life' => 120, 'hit' => 9 } - 这只是让 BAMBOO_HEAD = 字符串 "{ 'life' => 120, 'hit' => 9 }"?
  • @JeremyIglehart 不,分配没有。 puts ("put string") 可以。它调用#to_s 的参数(在这种情况下是哈希),从而产生字符串。我更新了那部分具有误导性的答案,因为puts 没有返回参数。
  • 那么,DEATH = {'name' => value, 'another_name' => value2} 是怎么回事 - 这是一个散列文字吗?它是在创建一个数组并将其分配给 DEATH 吗?我糊涂了。原谅我,只是想理解这些 Ruby 的东西,而我正在阅读的教程没有我想要的那么详细。
【解决方案2】:

哈希火箭是一个句法标记

哈希火箭实际上是一个句法标记。你可以在ext/ripper/ripper.y定义的语法中找到token:

%token tASSOC           /* => */

换句话说,Ripper 使用哈希火箭来关联事物。

如何使用 tASSOC

通常,此标记用于散列文字中以将键与值相关联。例如:

{ :e => 'foo' }

将字符串文字foo 与符号:e 相关联。这种常见用法是人们倾向于将哈希火箭视为仅与哈希相关的构造的原因。

另一方面,以下将变量与异常相关联:

rescue => e

在这种情况下,Ripper 将变量e 与隐含的StandardError 异常相关联,而不是将键与值相关联,并使用该变量来存储Exception#message 的值。

进一步阅读

如果您了解分词器、词法分析器和解析器,ripper.yext/ripper/lib/ripper 的各种内容具有指导意义。然而,在 Ruby Under a Microscope 的第 19 页上,Pat Shaughnessy 警告说:

Ruby 不使用 Lex 标记化工具,C 程序员通常将其与 Yacc 或 Bison 等解析器生成器结合使用。相反,Ruby 核心手动编写了 Ruby 标记化代码。

当您尝试在源代码级别了解 Ruby 的语法时,请记住一些事情。

【讨论】:

  • 非常好的答案,我的朋友 - 我在这里切换到你的答案,尽管另一个人让我工作得更快。我切换的原因是为了让未来的人明白我相信这个答案更简洁。干杯,
猜你喜欢
  • 2012-04-20
  • 2014-03-18
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
  • 2023-01-30
  • 2013-06-09
相关资源
最近更新 更多