4

例を考えると:

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
4

2 に答える 2

15

ハッシュロケットは構文トークンです

ハッシュロケットは実際には構文トークンです。トークンは、次のように定義された文法で見つけることができますext/ripper/ripper.y

%token tASSOC           /* => */

つまり、リッパーはハッシュロケットを使用して物事を関連付けます。

tASSOCの使用方法

一般に、このトークンは、キーを値に関連付けるためにハッシュリテラルで使用されます。例えば:

{ :e => 'foo' }

文字列リテラルfooを記号に関連付けます:e。この一般的な使用法は、人々がハッシュロケットを単にハッシュ関連の構成物と考える傾向がある理由です。

一方、以下は変数を例外に関連付けます。

rescue => e

In this case, rather than associating a key with a value, Ripper is associating the variable e with the implied StandardError exception, and uses the variable to store the value of Exception#message.

Further Reading

If you understand tokenizers, lexers, and parsers, ripper.y and the various contents of ext/ripper/lib/ripper are instructive. However, on page 19 of Ruby Under a Microscope, Pat Shaughnessy warns:

Ruby doesn’t use the Lex tokenization tool, which C programmers commonly use in conjunction with a parser generator like Yacc or Bison. Instead, the Ruby core wrote the Ruby tokenization code by hand.

Just something to keep in mind when you're trying to grok Ruby's grammar at the source code level.

于 2013-01-18T00:54:03.070 に答える
3

Ruby情報ページにはたくさんの良いリンクがあります。

それは文脈に依存します。

それの文脈では、rescueそれは次のことを意味します:

「例外オブジェクトを変数に割り当てますe。」

これは、e.to_s後で使用する方法です。

ハッシュリテラルでは、次のことを意味します。

key=>valueで表されるペア。

ハッシュリテラルは2つのペアから作成されます。{: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}"

于 2013-01-17T23:46:06.143 に答える