1

I have a Door object that has a state attribute of type string. It can only be one of these elements: %w[open shut locked].

Are there any implications or reasons for using strings over symbols?

door.update_attributes(state: :open)
door.update_attributes(state: 'open')

In Rails 4 we can do this:

Door.order(created_at: :desc)

So why shouldn't I do this?

Door.where(state: :open) # vs state: 'open'

Are they equivalent for all intents and purposes? I prefer to use a symbol because it looks cleaner, and in the DB, a symbol will be a string anyway.

4

2 回答 2

3

使用符号和字符串之间的区别在于,如果该特定对象不再被变量引用或保存在某个集合(例如哈希或数组)中,则字符串将被垃圾收集。

因此,如果它们不在仍然存在的集合中,它们最终将被垃圾收集,但Symbols在程序的生命周期内永远存在。

如果您的键不再引用“打开”字符串,则该字符串有资格进行垃圾回收,但如果它是该值的符号,则该键不再引用它,但它会在内存中徘徊。

这可能是一件非常糟糕的事情™</p>

于 2013-07-24T22:49:33.473 回答
3

你的直觉是对的,恕我直言。

符号比字符串更适合表示枚举类型的元素,因为它们是不可变的。虽然它们确实不会被垃圾回收,但与字符串不同,任何给定符号总是只有一个实例,因此对于大多数状态转换应用程序的影响是最小的。而且,虽然对于大多数应用程序来说性能差异也很小,但符号比较比字符串比较快得多。

参见Ruby 中的枚举

于 2013-07-24T22:59:40.217 回答