我们何时知道应该使用符号?

时间:2013-01-21 17:46:25

标签: ruby-on-rails ruby ruby-on-rails-3

这是我想要理解的代码,现在令人困惑的部分是代码中的:product_id,特别是“:product_id”的“:”部分 我的问题是我们应该怎么知道我们应该使用“:”?

def up
    # replace multiple items for a single product in a cart with a single item
    Cart.all.each do |cart|
      # count the number of each product in the cart
      sums = cart.line_items.group(:product_id).sum(:quantity)

      sums.each do |product_id, quantity|
        if quantity > 1
          # remove individual items
          cart.line_items.where(product_id: product_id).delete_all

          # replace with a single item
          item = cart.line_items.build(product_id: product_id)
          item.quantity = quantity
          item.save!
        end
      end
    end
  end

2 个答案:

答案 0 :(得分:3)

符号:

  • 基本上是字符串常量
  • 创建一次。即使您使用它,:product_id也将是同一个对象。因此他们节省了记忆。另一方面,如果多次编写"product_id",则基本上创建了多个字符串对象
  • 除非在符号上使用to_s方法,否则不能利用Reg-ex和插值(大多数)

简而言之,使用符号表示您不需要处理或修改的短字符串常量。

例如:符号非常适合哈希等中的键。获取它吗?

答案 1 :(得分:2)

符号只是指向包含其名称的对象的指针,而字符串始终是不同的对象。

如果您要在代码中多次重复使用某个名称,请使用一个符号,该符号相当于只使用一个对象。

例如,如果您在代码中使用字符串"France" 100次,则您更愿意使用:France。优点是,在第一种情况下,您将实例化100个对象,在第二种情况下只需一个。

在您的示例中,您可能会感到困惑,因为product_id: product_id是以JSON样式表示的哈希。这相当于:product_id => product_id