1

私は次のコードが何をすべきかをまとめるのに多くの困難を抱えています(私はそれが何をすべきかを理解しています、私はただそれらをまとめることができません):

def roles=(roles)
  self.roles_mask = (roles & ROLES).map { |r| 2**ROLES.index(r) }.inject(0, :+)
end

def roles
  ROLES.reject do |r|
    ((roles_mask || 0) & 2**ROLES.index(r)).zero?
  end
end

ROLESリンクで指定された配列です。roles配列でもあると思います。

  1. セッターメソッドと通常のメソッドが同じ名前であるのはなぜですか?
  2. mapメソッドのオブジェクトとして機能する配列はどれですか?rolesis['author', 'editor']ROLESisの場合['author', 'editor', 'manager']、演算子はどのようにして?&の配列を作成しmapますか?
  3. 2**ROLESですか?これは本当に2の累乗になっていることがわかりましたROLES.index(r)
  4. Railsアプリケーションのビットマスク属性」は、配列に対して(roles & ROLES)パラメーターをサニタイズしていると言っていますが、サニタイズとはどういう意味ですか?rolesROLES
  5. rが配列の現在の値である場合、戻り値のメソッドは(roles & ROLES)どのようになりますか?これが配列内のの位置を返していることはわかりましたが、これとどのように相互作用/機能するかはまだわかりません。index2**ROLESrrolesROLES(roles & ROLES).map
  6. injectメソッドは、メソッドの括弧内の条件でどのように機能しmapますか?

このビットマスキングがどのように機能するかを理解したいのですが、式の右辺にあるものdef roles=(roles)が整数を返す方法がわかりません。

4

1 に答える 1

3

基本的に、このindex呼び出しは、の配列内での位置を決定することにより、指定された役割を整数に変換しますROLES。次に、2がこのインデックスの累乗にinjectなり、結果を単純に合計します。

簡単に言えば

&ステップ1は、2つの配列のどの値が一致するかを使用して、ROLESで見つかったロールを取得することです。

ステップ2、一致する役割ごとに2**indexを計算します。Mapは、これらの値の配列を返します。

ステップ3、配列を合計して最終的な整数を取得します。

アイデアは、役割の組み合わせごとに一意の整数を計算することです。

ゲッターは、一致するロールの組み合わせを返すプロセスを単に巻き戻します。

于 2012-12-16T06:02:57.053 に答える