"rescue Exception => e" 中的 "=>" 是什么意思?

5

给定以下示例:

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

8
请改善段落缩进的习惯。 - user166390
1
所有这些示例都来自于:http://www.humblelittlerubybook.com/book/html/index.html - Jeremy Iglehart
你不应该使用 rescue Exception - Exception 可能包含非常严重的错误。(并非批评你,而是教程的作者)。 - Andrew Grimm
2个回答

17

哈希箭头是一种语法标记

哈希箭头实际上是一种语法标记。您可以在ext/ripper/ripper.y中定义的语法中找到该标记:

%token tASSOC           /* => */

换句话说,Ripper使用哈希箭头来关联(associate)事物。

tASSOC的使用方式

一般来说,这个标记用于哈希字面量中将键与值关联起来。例如:

{ :e => 'foo' }
将字符串文字“foo”与符号“:e”相关联。这种常见用法是人们倾向于将哈希火箭仅视为与哈希有关的结构的原因。
另一方面,以下内容将变量与异常相关联:
rescue => e
在这种情况下,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
非常好的答案,我的朋友 - 我在这里转换到了你的答案,尽管另一个人让我更快地工作。我转换的原因是为了让未来的人们理解我认为这个答案更加简洁。干杯! - Jeremy Iglehart

4

在 Ruby Info 页面有很多好的链接

它取决于上下文。

rescue 上下文中,它的意思是:

“将异常对象分配给变量e。”

这就是后来可以使用e.to_s的方式。

在散列字面值中,它的意思是:

一对,由键=>值表示。

这里从两个对中创建了一个散列字面值:{:name => "Fred", :age => 20}

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

在字符串中,它是什么就是什么:

"=>Whee!"。

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

@JeremyIglehart 不是的,赋值语句不会这样做。puts("输出字符串")会这样做。它对参数(在这种情况下是一个哈希)调用 #to_s 方法,从而产生字符串。我更新了答案中误导人的部分,因为 puts 不会返回参数。 - user166390
那么,DEATH = {'name' => value, 'another_name' => value2} 这段代码是什么意思呢?
  • 这是一个哈希字面量吗?它是否创建了一个数组并将其赋值给 DEATH 变量?我感到有些困惑。请原谅我的问题,我只是试图理解这个 Ruby 的东西,但我正在阅读的教程没有提供足够详细的说明。
- Jeremy Iglehart
它创建了一个哈希并将其分配给常量DEATH。该行中没有数组 - user166390
我在这里找到了对我先前的评论/问题的很好的解释:http://www.ruby-doc.org/docs/ProgrammingRuby/html/intro.html - Jeremy Iglehart
请查看我在答案顶部添加的链接。它应该提供许多有用的资源链接!祝编码愉快。 - user166390
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接