我是Ruby的新手,并试图了解它的一些语法。
为什么此代码适用于异常对象的变量:
begin
puts Dir::delete
rescue ArgumentError => e
puts e.backtrace
end
但没有符号?
begin
puts Dir::delete
rescue ArgumentError => :e
puts e.backtrace
end
答案 0 :(得分:3)
符号是一个值。在您的示例中,您需要一个变量来存储Error对象。您通常使用符号作为字符串常量。
例如,如果您创建一个带有基本方向的模块,最好使用符号:north
,:south
,:east
,:west
而不是字符串{{ 1}},"north"
,"south"
和"east"
。
符号通常用作哈希中的键:
"west"
在github上读取ruby代码非常有用,以便了解何时使用符号。
答案 1 :(得分:2)
因为,当您在问题本身中写入时,您需要一个Exception对象,而不是Symbol对象。
在救援区中,您通过backtrace
对象访问e
,ArgumentException
类型为Symbol
,而非:e
类型。
因此,解释器解析Symbol
时实际发生的情况是,间接创建了一个新的:e
对象,并将其值设置为23
。这就像编写Fixnum
,其中间接创建了一个some_var = :e
e = :e
对象,其值设置为23.
但符号本身可以存储在变量中:
{{1}}
希望我的意思很清楚。
答案 2 :(得分: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
答案 3 :(得分:1)
代替变量名称的符号 - 从不(符号是值,名称是名称.Apple和橙色);
代替符号的变量 - 如您所愿(如s = :name; puts params[s]
);
代替字符串的符号 - 小心(如果你创建了太多的符号,你可能会遇到麻烦)。