【问题标题】:Why should I use a string and not a symbol when referencing object attributes?为什么在引用对象属性时应该使用字符串而不是符号?
【发布时间】:2013-07-24 14:55:48
【问题描述】:

我有一个Door 对象,该对象具有state 类型的string 属性。它只能是以下元素之一:%w[open shut locked]

在符号上使用字符串有什么含义或原因吗?

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

在 Rails 4 中我们可以这样做:

Door.order(created_at: :desc)

那我为什么不这样做呢?

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

它们是否在所有意图和目的上都等效?我更喜欢使用符号,因为它看起来更干净,而且在数据库中,符号无论如何都是字符串。

【问题讨论】:

    标签: ruby-on-rails ruby symbols


    【解决方案1】:

    您的直觉是正确的,恕我直言。

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

    另见Enums in Ruby

    【讨论】:

      【解决方案2】:

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

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

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

      这可能是一件非常糟糕的事情™

      【讨论】:

      • 符号与字符串是 Ruby 中我们需要注意的事情之一;对于我们需要注意的功能,每种语言都有类似的权衡。我认为它是编程“乐趣”的一部分。
      猜你喜欢
      • 2012-08-20
      • 1970-01-01
      • 2011-12-06
      • 1970-01-01
      • 1970-01-01
      • 2018-09-15
      • 2010-10-13
      • 1970-01-01
      • 2011-08-16
      相关资源
      最近更新 更多