2

私はRubyに不慣れで、その構文のいくつかに頭を悩ませようとしています。

このコードが例外オブジェクトの変数で機能するのはなぜですか。

begin
  puts Dir::delete
rescue ArgumentError => e
  puts e.backtrace
end

しかし、シンボルではありませんか?

begin
  puts Dir::delete
rescue ArgumentError => :e
  puts e.backtrace
end
4

4 に答える 4

3

記号は値です。この例では、Errorオブジェクトを格納するための変数が必要です。通常、文字列定数として記号を使用します。

たとえば、基本的な方向を使用してモジュールを作成する場合は、文字列、、、および。ではなく、記号、、を使用することをお勧めし:northます。:south:east:west"north""south""east""west"

シンボルは、ハッシュのキーとしてよく使用されます。

my_hash = { a: 1, b: 7, e: 115 }

シンボルをいつ使用するかを理解するために、たとえばgithubでrubyコードを読むと非常に便利です。

于 2012-05-12T06:33:50.913 に答える
2

なぜなら、質問自体に書き込むときは、SymbolオブジェクトではなくExceptionオブジェクトが必要だからです。

レスキューブロックでは、タイプではなくタイプのオブジェクトbacktraceを介してアクセスしています。eArgumentExceptionSymbol

したがって、インタプリタが解析するときに実際に発生するの:eは、間接的に新しいSymbolオブジェクトが作成され、その値がに設定されること:eです。23これは、Fixnumオブジェクトが間接的に作成され、その値が23に設定される書き込みのようなものです。

ただし、シンボル自体は変数に格納できます。

some_var = :e
e = :e

私が何を意味するのかがはっきりしていることを願っています。

于 2012-05-12T06:31:18.173 に答える
1

eは例外オブジェクトが格納されている変数であり:e、データ型であるため、一種の値だと思います。

いくつかの例

# standard way of assign variable will work
e = ArgumentError.new 

# assign to data will not work
:e = ArgumentError.new
'e' = ArgumentError.new
 1 = ArgumentError.new
于 2012-05-12T06:28:08.610 に答える
1

変数名の代わりの記号-決して(記号は値、名前は名前。アップルとオレンジ)。

記号の代わりの変数-必要に応じて(のようにs = :name; puts params[s]);

文字列の代わりに記号-注意してください(作成する記号が多すぎると、問題が発生する可能性があります)。

于 2012-05-12T06:30:39.433 に答える