2012-12-16 118 views
0

我遇到了很多的困難放在一起是什麼following code應該做的事(我明白了什麼是應該做的,我只是不能放在一起件):的Ruby語法:位掩碼

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. 爲什麼要使用同名的setter方法和常規方法?
  2. 什麼陣列作爲map方法的對象?如果roles['author', 'editor']ROLES['author', 'editor', 'manager'],那麼&運算符如何爲map創建一個數組?
  3. 什麼是2**ROLES我想通了,這真的只是2提高到ROLES.index(r)的力量。
  4. Bitmask attributes on a Rails application」說(roles & ROLES)正在對陣列ROLES進行參數roles的消毒處理,但是消毒是什麼意思?
  5. 如果r是數組(roles & ROLES)的當前值,index方法2**ROLES如何返回r我發現這是roles的位置ROLES,但我仍然不知道如何與(roles & ROLES).map進行交互/處理。
  6. inject方法如何在map方法的括號內的條件下工作?

我想弄清楚這個位掩碼如何工作,但我不知道如何在def roles=(roles)的公式右邊返回一個整數。

+0

1.'roles ='與'role'是不同的方法名稱。 2.數組#&:返回一個新數組,其中包含兩個數組共有的元素,沒有重複。 (解釋在The Pickaxe http:// pragprog中找到。com/book/ruby​​3/programming-ruby-1-9) – BernardK

+0

「roles =是與角色不同的方法名稱」 但第二個名爲「roles」。那麼你說角色=()和角色是兩個不同的方法名?如果是這樣,我明白了。謝謝! –

+0

對不起,錯字。我們說'roles'是一個_getter_,返回一個值,並且'roles =()'是一個_setter_,修改了這個值。編寫'roles = xyz'是Ruby的語法糖。實際上,等號是方法名稱的一部分,如果角色是方法的話。但是在'var = xyz'中,如果var是一個變量,等號只是賦值操作符。用** attr_accessor **進行搜索會給你很多答案,就像http://stackoverflow.com/questions/4370960/what-is-attr-accessor-in-ruby – BernardK

回答

3

基本上,index調用通過確定它們在ROLES的數組中的位置來將給定角色轉換爲整數。 2然後提高到這個指數的權力,並且inject只是將結果相加。

簡而言之

第1步是讓那些角色中使用&瑟這兩個陣列的匹配值找到角色。

第2步,爲每個匹配角色計算2 **索引。 Map返回這些值的數組。

第3步,總結數組得到最終整數。

這個想法是爲每個角色組合計算一個唯一的整數。

getter簡單地展開該過程,返回匹配的角色組合。