Ruby中的符号是什么?


45

我是Ruby世界的新手,我对符号的概念有些困惑。符号和变量有什​​么区别?为什么不仅仅使用变量?

谢谢。


在Lisp中(从Ruby派生的),符号本质上是变量的数据类型;这意味着您可以在执行程序时以反射式方式操纵程序。(不是最连贯的解释,对不起)
Paul Nathan 2010年

Answers:


70

变量和符号是不同的东西。变量指向不同类型的数据。在Ruby中,符号更像是字符串,而不是变量。

在Ruby中,字符串是可变的,而符号是不可变的。这意味着只需要创建一个符号的副本。因此,如果您有

x = :my_str
y = :my_str

:my_str只会被创建一次,xy指向相同的内存区域。另一方面,如果您有

x = "my_str"
y = "my_str"

包含的字符串my_str将创建两次x并且y将指向不同的实例。

结果,符号通常用作Ruby中枚举的等效项,以及字典的键(哈希)。


1
只是要表达@mipadi的观点,当您比较字符串时,需要将每个字符彼此进行比较。因此,比较相同的字符串为O(n)。而红宝石符号比较对象引用则为O(1)。
Jeremy Heiler 2010年

为什么Python没有这个?
工作

您也应该小心不要过度使用它们,因为我上次知道,但是我没有在> 1.9的红宝石中对此进行研究,符号没有得到
gc'd认证

它们在Smalltalk中的行为相同,只是它们看起来像#mySymbol
Frank Shearar 2010年

@ frogstarr78-除非您以编程方式生成符号(在不先检查字符串的情况下生成字符串),否则您不必担心生成过多的符号。
贾斯汀·L.


0

通常,变量倾向于与字符串混淆,但是我可以理解您认为它就像一个变量。这是可以理解的。这样想:

游戏中玩家的状态用数字表示。1表示存活,2表示不确定,3表示死亡。可以很容易地用符号代替。符号可以是:alive :unsure:dead。要检查玩家是否还活着,而不是这样做:

if player_status == 1

您可以这样做:

if player_status == :alive

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.