如果没有条件不能按预期工作

时间:2015-05-26 15:19:52

标签: grails

我写了一个if else条件,它使用if not(!)来抛出错误。但是,条件不符合我的预期,无论谁是currentUser,都会抛出错误:

public void findCorrectUserRole() {
    if (Book.name.equals("Test Answers")) {
        User currentUser = User.getCurrentUser()
        if (currentUser) {
            if (!currentUser.hasUserRole("Teacher") || !currentUser.hasUserRole("System Administrator")) {
                throw new LCEX("Sorry, only a teacher or System Administrator can edit this.");
            }
        }
    }else{
        "Do Something Else"
    }
}

2 个答案:

答案 0 :(得分:4)

你做出了一个无效的假设,即逻辑非运算符与逻辑运算一样,与负号在代数中工作的方式相同。有一个名为DeMorgan's Law的规则可以帮助您安全地转换逻辑表达式。

在编写代码时,用户只有一种方法可以避免出现此异常,用户必须具有教师和系统管理员的角色:

groovy:000> a = true; b = false; !a || !b // only one is true -> true
===> true
groovy:000> a = b = false; !a || !b  // neither is true -> true
===> true
groovy:000> a = b = true; !a || !b  // both are true -> false
===> false

如果使用DeMorgan定律重写,则可能会更清楚(从parens中取出否定意味着运算符必须从||更改为&&);你的代码等同于:

if (!(currentUser.hasUserRole("Teacher") 
&& currentUser.hasUserRole("System Administrator"))) {

“当前用户不具备教师和系统管理员的角色”

绝对不是你想要的。你想要的是

if (!currentUser.hasUserRole("Teacher") 
&& !currentUser.hasUserRole("System Administrator")) {

“当前用户没有教师的角色,并且没有sysadmin的角色”

等价地你可以把它写成

if (!(currentUser.hasRole("Teacher") 
|| currentUser.hasRole("System Administrator"))) {

“当前用户不具备教师或系统管理员的角色”

DeMorgan's Law是:

  

“不(A和B)”与“(不是A)或(不是B)”

相同      

“not(A或B)”与“(不是A)和(不是B)”相同。

答案 1 :(得分:0)

你的if条件错误应该是:

if (!currentUser.hasUserRole("Teacher") && !currentUser.hasUserRole("System Administrator")) {
            throw new LCEX("Sorry, only a teacher or System Administrator can edit this.");
          }

if (!(currentUser.hasUserRole("Teacher") || currentUser.hasUserRole("System Administrator"))) {
            throw new LCEX("Sorry, only a teacher or System Administrator can edit this.");
          }

现在,如果当前用户角色是"老师",他不是"系统管理员"所以if条件是真的。