无法在Ruby中获得符号的悬念

时间:2011-07-17 17:29:15

标签: ruby symbols

我一直在寻找过去几天如何理解Ruby中的符号。我在谷歌阅读关于Ruby符号的每篇文章,其中大多数都是错误的解释,所以我来到这里,我看到有关于这个主题的一些问题,但是我不明白,抱歉。

根据我的阅读,我理解符号是不可变的且唯一的,因此内存消耗和性能优于常规字符串。

问题#1
生活中的符号目的是为字符串提供同样的利基吗?符号的目的是在没有值的情况下作为方便的常量运行,比如之后的部分:它是实际值吗?

问题#2
我什么时候才知道在哪里使用符号?

我会高度评价您自己对符号的解释,而不是链接到Google上的文章(我确保我已经阅读过了!)。

如果你能提供更多关于符号的信息,我也会提供你的时间,因为我根本不理解它们,甚至不存在于:symbol_something,它是参考还是什么?

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:6)

ruby中的

符号是一种有效利用不可变字符串的方法。例如,假设您要使用字符串“my_key”作为哈希键。简单地使用字符串会浪费空间和效率,因为每次指定哈希键“my_key”时,即使字符串值内容相同,您也会在不同的内存位置创建不同的字符串实例!因此,如果您有100个my_hash ['my_key']实例,则您有100个字符串'my_key'的实例。符号不是这样的:my_key。无论你使用多少次,都只有一个:my_key实例!

您应该使用通常使用不可变字符串作为标识符的符号。

答案 1 :(得分:1)

理解这一点的方法是考虑String是一个Ruby对象,并且它没有被指定为不可变的。因此,语言处理器无法进行许多优化,并且代码的读者可能会或可能不会理解给定字符串是作为可变数据结构还是作为某事物的关键。

但符号不可变的,因此它们具有唯一的实例。它们也很容易输入,并且使用符号可以清楚地向以后阅读代码的任何人显示“identifier”“token”

最后,类Symbol实现显式转换 #to_s,,因此符号可以安全地用于您将要调用#to_s的表达式中,例如在{{3}中或者在I / O操作中。