2010-09-14 68 views
1
def role?(role) 
    return !!self.roles.find_by_name(role.to_s.camelize) 
end 

你能幫我理解上面的代碼中發生了什麼嗎?我是Rails/Ruby的新手。Rails代碼在做什麼?

感謝

回答

4

它的否定(!)操作重複兩次。

請注意,只有評估爲false(布爾表達式)的ruby對象本身是nilfalse本身。

因此,

  1. some_role將是真實的,!some_role是假的,!!some_role又是真實的。
  2. nil爲假,!nil爲真,!!nil爲假。

所以,這是一個「聰明」的方法來檢查角色是否從find_by_name返回爲零與否。 (因此是否存在與這樣的名字的角色)

我想,我不必告訴你這樣做對可讀性不好。您可以隨時通過正常方式檢查結果是否爲零,如result.nil?result == nil

+0

謝謝,不知道我明白了。你怎麼能重寫這個可讀性,對於一個鐵軌新手? – AnApprentice 2010-09-14 04:04:13

+0

@nobosh我重構了一下。 – 2010-09-14 04:13:15

+0

我很好奇,如果有意義的話,你如何能夠將其改寫得更清楚? thxs – AnApprentice 2010-09-14 04:24:25

1

這更具可讀性。不需要'自我'或'回報'。 '當下?'與'無'相反嗎?所以不需要否定。

def role?(role) 
    roles.find_by_name(role.to_s.camelize).present? 
end