"救援例外=> e"中的"=>"是做什么的?

Jer*_*art 3 ruby syntax rescue hashrocket

举个例子:

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
Run Code Online (Sandbox Code Playgroud)

在它说:

rescue NoMethodError => e:
Run Code Online (Sandbox Code Playgroud)

什么是'=>'做什么?

它与这种用法有何不同:

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
Run Code Online (Sandbox Code Playgroud)

Tod*_*obs 13

哈希火箭是一种句法令牌

哈希火箭实际上是一个语法标记.您可以在以下定义的语法中找到令牌ext/ripper/ripper.y:

%token tASSOC           /* => */
Run Code Online (Sandbox Code Playgroud)

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

如何使用tASSOC

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

{ :e => 'foo' }
Run Code Online (Sandbox Code Playgroud)

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

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

rescue => e
Run Code Online (Sandbox Code Playgroud)

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

进一步阅读

如果您了解标记器,词法分析器和解析器,ripper.y以及各种内容ext/ripper/lib/ripper是有益的.然而,在Ruby Under a Microscope的第19页,Pat Shaughnessy警告说:

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

当您尝试在源代码级别上查看Ruby的语法时,请记住一些事项.

  • 很好的回答我的朋友 - 我在这里切换到你的答案,虽然另一个人让我工作得更快.我转换的原因是为了让未来的人明白我相信这个答案更简洁.干杯, (2认同)

小智 5

Ruby Info 页面上有很多很好的链接。

这取决于上下文。

在 a 的上下文中,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}"