def current_user
@current_user ||= session[:user_id] && User.find(session[:user_id])
end
短短一行代码,却含有很多逻辑,以前老是搞混,这里总结一下。
这句代码相当于
def current_user
if @current_user
return @current_user
else
if session[:user_id]
@current_user = User.find(session[:user_id])
else
@current_user = nil
end
return @current_user
end
end
展开后的代码看起来很恶心,代码意思为:如果@current_user不为空直接返回@current_user。
如果@current_user为空,则根据session中的user_id判断是否登录,如果已经登录则查找出用户信息并返回。如果没有登录则返回空。
这里总结下各符号用法:
and 与 && 为和,区别是and优先级比&&低。
irb(main):001:0> bool_t = true
=> true
irb(main):002:0> bool_f = false
=> false
irb(main):003:0> bool_f and bool_t ? true : true
=> false
irb(main):004:0> bool_f && bool_t ? true : true
=> true
>> false and true ? 'hello' : '**silence**'
=> false # oops
>> false && true ? 'hello' : '**silence**'
=> "**silence**"
>> flag = true && false
=> false
>> flag = true and false
=> false
>> flag
=> true # oops
>> flag2 = (true and false)
=> false
>> flag2
=> false
or 与 || 为或,not与!为非,区别均是前者优先级低于后者
&&=, !=, ||=这个比较灵活,以前习惯用Java,可以认为它相当于Java里的+=,-=。
a &&= b即为a = a && b。可见Ruby比Java灵活很多。
Ruby的&&, ||与其它语言有些不同。
&&运算法则为:左边为false或nil时,直接分别返回false或nil,右边将不会运算。
左边不为false或nil时,返回右边的对象。
||运算法则为:左边为false或nil时,返回右边的对象。
左边不为false或nil时,直接返回左边的对象,右边的不会运算。
几个例子:
puts false && "abc" # => false
puts nil && "abc" # => nil
puts true && "abc" # => "abc"
puts "123" && "abc" # => "abc"
puts false || "abc" # => "abc"
puts nil || "abc" # => "abc"
puts true || "abc" # => true
puts "123" || "abc" # => "123"
其实||=这个运算符里面比较复杂,或者说有点乱。
x ||= y
#相当于
x || x=y
#而不是
x = x||y
#区别在于如果x存在且不为空时不会执行任何操作,直接返回。
#还相当于
if defined? x
x || x=y
else
x = y
end
原文转自:Ruby迷:http://rubyer.me/blog/568/
在布尔表达式中使用&&/||
,在流程控制时使用and/or
(如果你在使用时发现需要添加额外的括号来表达逻辑,这说明你很可能用错了运算符)。
# 布尔表达式
if some_condition && some_other_condition
do_something
end
# 流程控制
document.saved? or document.save!
分享到:
相关推荐
运算符与控制流:掌握Ruby中的运算符(如算术运算符、比较运算符、逻辑运算符等),以及控制流语句(如条件语句、循环语句等)。 函数与模块:学习如何定义和使用函数,了解模块的概念和用法,实现代码的复用和...
Ruby支持一系列丰富的运算符的一个现代化的语言。大多数运算符实际上是方法调用。例如,a + b的被解释为a, +(b)变量引用的对象的方法被称为一个用b作为它的参数。 对于每个运算符 (+ – * / % ** & | ^ << >> ...
花见::验证Ruby对象的... 为此,我们将业务需求转换为谓词,这些谓词与Ruby人造布尔逻辑运算符(例如&或| )链接在一起。 想想一个注册表格。 我们需要使用以下规则来确保name字段的数据完整性。 这是必需的,它必须:
Google Ruby的指数运算符,或参考上一课中有关简单数学的内容。先进的一旦测试通过,请查看是否可以使用更高级别的迭代器(例如.collect 。期望例子numbers = [ 1 , 2 , 3 ]square_array ( numbers )# => [1,4,9])...
Google Ruby的指数运算符,或参考上一课中有关简单数学的内容。申请while遍历数组要构建此方法,请在while使用迭代器并实现自己的逻辑。 仅使用while , Array和该解决方案的任何其他先前讨论的方法。 不要使用Ruby...
Priora:用于Ruby的对象优先级排序实用程序 Priora提供了一种简单直观的方法来对Ruby中的对象集合进行优先级排序。它是一个有用的实用程序,用于处理某些数据类的多个实例的集合。通常,我们希望按照某种优先级排序...
Google Ruby的指数运算符,或参考上一课中有关简单数学的内容。 先进的 一旦测试通过,请查看是否可以使用更高级别的迭代器(例如.collect 。 期望例子 numbers = [ 1 , 2 , 3 ] square_array ( numbers ) # => [1,...
Google Ruby的指数运算符,或参考上一课中有关简单数学的内容。 先进的 一旦测试通过,请查看是否可以使用更高级别的迭代器(例如.collect 。 期望例子 numbers = [ 1 , 2 , 3 ] square_array ( numbers ) # => [1,...
Google Ruby的指数运算符,或参考上一课中有关简单数学的内容。 先进的 一旦测试通过,请查看是否可以使用更高级别的迭代器(例如.collect 。 期望例子 numbers = [ 1 , 2 , 3 ] square_array ( numbers ) # => [1,...
Google Ruby的指数运算符,或参考上一课中有关简单数学的内容。 先进的 一旦测试通过,请查看是否可以使用更高级别的迭代器(例如.collect 。 期望例子 numbers = [ 1 , 2 , 3 ] square_array ( numbers ) # => [1,...
使用Node.js创建的Node.js 印象深刻的是我挑战用Node.js制作迷你Node.js. ...初榨esprima ...... ......符的计算器......添加否定和逻辑运算符 执照/执照 该示例已获得MIT许可 该存储库由MIT许可证提供
Lear to Program 中工作时的代码片段,第二版第02章 - 数字简单算术导论整数和浮点数第05章 混合铸造/转换简介带有 get 和 chomp 的用户输入第 06 章 - 关于方法的更多信息字符串方法简介模运算符随机数和 ...
弗兰纳根(David Flanagan)是一名程序员,也是一名作家,他在O’Reilly出版的其他畅销书还包括《JavaScript Pocket Reference》、《The Ruby Programming Language》、以及《Java in a Nutshell》。David毕业于麻省...
他在O’Reilly出版的其他畅销书还包括《JavaScript Pocket Reference》、《The Ruby Programming Language》、以及《Java in a Nutshell》。David毕业于麻省理工学院,获得计算机科学与工程学位。他和妻子和孩子一起...
他在O’Reilly出版的其他畅销书还包括《JavaScriptPocket Reference》、《The Ruby Programming Language》、以及《Java in aNutshell》。David毕业于麻省理工学院,获得计算机科学与工程学位。他和妻子和孩子一起...
他在O’Reilly出版的其他畅销书还包括《JavaScript Pocket Reference》、《The Ruby Programming Language》、以及《Java in a Nutshell》。David毕业于麻省理工学院,获得计算机科学与工程学位。他和妻子和孩子一起...
他在O’Reilly出版的其他畅销书还包括《JavaScript Pocket Reference》、《The Ruby Programming Language》、以及《Java in a Nutshell》。David毕业于麻省理工学院,获得计算机科学与工程学位。他和妻子和孩子一起...
3.7.6 逻辑运算符 67 3.7.7 三目运算符 68 3.7.8 运算符的结合性和优先级 69 3.8 本章小结 70 本章练习 70 第4章 流程控制和数组 71 4.1 顺序结构 72 4.2 分支结构 72 4.2.1 if条件语句 72 4.2.2 switch...
弗兰纳根(David Flanagan)是一名程序员,也是一名作家,他在O’Reilly出版的其他畅销书还包括《JavaScript Pocket Reference》、《The Ruby Programming Language》、以及《Java in a Nutshell》。David毕业于麻省...
Coeus是计算树逻辑(CTL)模型检查器。 特别是,它支持以下工作流程: 定义状态机模型 解析CTL表达式字符串 根据模型评估CTL表达式 建筑学 Coeus由3个关键组件组成:模型,CTL表达解析器和标签算法 模型 严格来说,...