Ruby - 你能告诉我这里发生了什么吗?

时间:2011-09-17 13:28:37

标签: ruby-on-rails ruby

这种方法感到困惑 - 有人可以向我解释一下吗?

def current_user
    @current_user ||= (login_from_session || login_from_cookie) unless @current_user == false
end

1 个答案:

答案 0 :(得分:4)

它说:

  1. 除非未设置电流(最新除非)
  2. 如果已设置@current_user@current_user部分)
  3. ,则不执行任何操作并返回||=
  4. else调用方法/帮助器login_from_session并将结果分配给@current_user
  5. 如果之前的调用已返回nilfalse,请调用方法/帮助login_from_cookie并将结果分配给@current_user
  6. 在任何情况下都返回@current_user实例变量
  7. 的值

    可以通过这种方式重写它更明确

    def current_user
      if !(@current_user == false) # 1
        if (@current_user)
          return @current_user # 2
        end
        if (@current_user = login_from_session)
          return @current_user # 3
        end
        if (@current_user = login_from_cookie)
          return @current_user # 4
        end  
      end
      return @current_user # 5
    end
    

    这是红宝石表现力的力量(和美)。请记住,在Ruby中,只有nilfalse在if / else语句和||&&运算符

    中评估为布尔值false

    其他提示要更好地理解,在红宝石中你有以下规则:

    任何函数的返回值是为函数计算的最后一个表达式,所以

    def foo
      any_value
    end
    

    相同
    def foo
      return any_value
    end
    

    表达式末尾的if / unless语句与if / unless语句相同,所以

    do something if value
    

    相同
    if (value)
      do_something
    end
    

    ||=运算符是

    的快捷方式
    @a ||= some_value
    # is equivalent to
    if !@a
      @a = some_value
    end
    

    结合所有这些规则,你已经解释了这个方法。