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

記号:

  • 基本的に文字列定数です
  • 一度作成されます。つまり:product_id、使用するたびに同じオブジェクトになります。したがって、メモリを節約します。一方、"product_id"複数回書くと、基本的に同じ数の文字列オブジェクトを作成しています
  • シンボルで to_s メソッドを使用しない限り、Reg-ex と補間 (ほとんど) の恩恵を受けることはできません

簡単に言えば、処理や変更の必要がない短い文字列定数にはシンボルを使用します。

例: シンボルは、ハッシュなどのキーに最適です。

于 2013-01-21T18:06:42.780 に答える
2

文字列は常に異なるオブジェクトですが、シンボルはその名前を含むオブジェクトへの単なるポインターです。

コード内で名前を何度も繰り返す場合は、オブジェクトを 1 つだけ使用するのと同等のシンボルを 1 つ使用します。

たとえば"France"、コードで文字列 a を 100 回使用する場合は、:France. 利点は、最初のケースでは 100 個のオブジェクトをインスタンス化し、2 番目のケースでは 1 つだけインスタンス化することです。

あなたの例でproduct_id: product_idは、ハッシュが JSON スタイルで表されているため、混乱している可能性があります。これは、:product_id => product_id

于 2013-01-21T20:21:21.813 に答える