举个例子:
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
答案 0 :(得分:11)
哈希火箭实际上是一个语法标记。您可以在ext/ripper/ripper.y
:
%token tASSOC /* => */
换句话说,Ripper使用哈希火箭来关联事物。
通常,此标记用于散列文字以将键与值相关联。例如:
{ :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的语法时,请记住一些事项。
答案 1 :(得分:3)
有一堆good links on the Ruby Info page。
这取决于背景。
rescue
的上下文中,它意味着:“将异常对象分配给变量e
。”
以后可以将其用作e.to_s
。
一对,由key => value。
表示这是一个Hash文字,由两对创建:{:name => "Fred", :age => 20}
(Ruby 1.9 / 2.0 +也允许{name: "Fred", age: 20}
语法,其中name
和age
引用符号。)
“=> Whee!”
。在这种情况下,puts FighterValues::DEATH
相当于puts FighterValues::DEATH.to_s
。也就是说,显示的输出来自字符串。考虑一下:puts "{a => b}"
。