2013-01-21 192 views
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 
+0

在这段代码中,你给它并不重要。一般来看看方法文档,看它是否期待符号或字符串(或它们之间的区别) –

回答

2

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

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

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

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

3

符号:

  • 基本上都是字符串常量
  • 创建一次。即:product_id将在你使用它时是同一个对象。因此他们节省了内存。对,如果你写"product_id"多次另一方面,你基本上是建立尽可能多的String对象
  • 不能采取REG-EX和插值(大部分)的好处,除非你在一个符号使用to_s方法

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

例如:符号对于Hashes等中的键很有用。

相关问题