2010-09-14 98 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