什么时候在Ruby中使用符号代替变量是正确的?

时间:2012-05-12 06:18:02

标签: ruby-on-rails ruby programming-languages

我是Ruby的新手,并试图了解它的一些语法。

为什么此代码适用于异常对象的变量:

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

但没有符号?

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

4 个答案:

答案 0 :(得分:3)

符号是一个值。在您的示例中,您需要一个变量来存储Error对象。您通常使用符号作为字符串常量。

例如,如果您创建一个带有基本方向的模块,最好使用符号:north:south:east:west而不是字符串{{ 1}},"north""south""east"

符号通常用作哈希中的键:

"west"

在github上读取ruby代码非常有用,以便了解何时使用符号。

答案 1 :(得分:2)

因为,当您在问题本身中写入时,您需要一个Exception对象,而不是Symbol对象。

在救援区中,您通过backtrace对象访问eArgumentException类型为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]);

代替字符串的符号 - 小心(如果你创建了太多的符号,你可能会遇到麻烦)。