1

这是我试图理解的代码,目前令人困惑的部分是代码中的 :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
4

2 回答 2

3

符号:

  • 基本上是字符串常量
  • 被创建一次。ie:product_id无论何时使用它都会是同一个对象。因此,它们可以节省内存。另一方面,如果您"product_id"多次编写,您基本上是在创建尽可能多的字符串对象
  • 除非您在符号上使用 to_s 方法,否则无法利用 Reg-ex 和插值(大部分)

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

例如:符号非常适合散列等中的键。明白了吗?

于 2013-01-21T18:06:42.780 回答
2

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

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

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

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

于 2013-01-21T20:21:21.813 回答