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
也是一個數組。
- 爲什麼要使用同名的setter方法和常規方法?
- 什麼陣列作爲
map
方法的對象?如果roles
爲['author', 'editor']
而ROLES
爲['author', 'editor', 'manager']
,那麼&
運算符如何爲map
創建一個數組? - 什麼是
2**ROLES
? 我想通了,這真的只是2
提高到ROLES.index(r)
的力量。 - 「Bitmask attributes on a Rails application」說
(roles & ROLES)
正在對陣列ROLES
進行參數roles
的消毒處理,但是消毒是什麼意思? - 如果
r
是數組(roles & ROLES)
的當前值,index
方法2**ROLES
如何返回r
? 我發現這是roles
的位置ROLES
,但我仍然不知道如何與(roles & ROLES).map
進行交互/處理。 inject
方法如何在map
方法的括號內的條件下工作?
我想弄清楚這個位掩碼如何工作,但我不知道如何在def roles=(roles)
的公式右邊返回一個整數。
1.'roles ='與'role'是不同的方法名稱。 2.數組#&:返回一個新數組,其中包含兩個數組共有的元素,沒有重複。 (解釋在The Pickaxe http:// pragprog中找到。com/book/ruby3/programming-ruby-1-9) – BernardK
「roles =是與角色不同的方法名稱」 但第二個名爲「roles」。那麼你說角色=()和角色是兩個不同的方法名?如果是這樣,我明白了。謝謝! –
對不起,錯字。我們說'roles'是一個_getter_,返回一個值,並且'roles =()'是一個_setter_,修改了這個值。編寫'roles = xyz'是Ruby的語法糖。實際上,等號是方法名稱的一部分,如果角色是方法的話。但是在'var = xyz'中,如果var是一個變量,等號只是賦值操作符。用** attr_accessor **進行搜索會給你很多答案,就像http://stackoverflow.com/questions/4370960/what-is-attr-accessor-in-ruby – BernardK