私はRubyに不慣れで、その構文のいくつかに頭を悩ませようとしています。
このコードが例外オブジェクトの変数で機能するのはなぜですか。
begin
puts Dir::delete
rescue ArgumentError => e
puts e.backtrace
end
しかし、シンボルではありませんか?
begin
puts Dir::delete
rescue ArgumentError => :e
puts e.backtrace
end
私はRubyに不慣れで、その構文のいくつかに頭を悩ませようとしています。
このコードが例外オブジェクトの変数で機能するのはなぜですか。
begin
puts Dir::delete
rescue ArgumentError => e
puts e.backtrace
end
しかし、シンボルではありませんか?
begin
puts Dir::delete
rescue ArgumentError => :e
puts e.backtrace
end
記号は値です。この例では、Errorオブジェクトを格納するための変数が必要です。通常、文字列定数として記号を使用します。
たとえば、基本的な方向を使用してモジュールを作成する場合は、文字列、、、および。ではなく、記号、、を使用することをお勧めし:north
ます。:south
:east
:west
"north"
"south"
"east"
"west"
シンボルは、ハッシュのキーとしてよく使用されます。
my_hash = { a: 1, b: 7, e: 115 }
シンボルをいつ使用するかを理解するために、たとえばgithubでrubyコードを読むと非常に便利です。
なぜなら、質問自体に書き込むときは、SymbolオブジェクトではなくExceptionオブジェクトが必要だからです。
レスキューブロックでは、タイプではなくタイプのオブジェクトbacktrace
を介してアクセスしています。e
ArgumentException
Symbol
したがって、インタプリタが解析するときに実際に発生するの:e
は、間接的に新しいSymbol
オブジェクトが作成され、その値がに設定されること:e
です。23
これは、Fixnum
オブジェクトが間接的に作成され、その値が23に設定される書き込みのようなものです。
ただし、シンボル自体は変数に格納できます。
some_var = :e
e = :e
私が何を意味するのかがはっきりしていることを願っています。
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
変数名の代わりの記号-決して(記号は値、名前は名前。アップルとオレンジ)。
記号の代わりの変数-必要に応じて(のようにs = :name; puts params[s]
);
文字列の代わりに記号-注意してください(作成する記号が多すぎると、問題が発生する可能性があります)。