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语言的功能性和灵活性。通过深入理解这些运算符的特点和用法,开发者能够更高效地利用Ruby...
逻辑运算符中的"&&"(逻辑与)优先级高于"||"(逻辑或)。如果不清楚具体的优先级,可能会导致意外的代码执行结果或错误。 ### 语句优先级 在Ruby中,语句的执行也遵循优先级规则。特别是在涉及复合语句,如条件...
逻辑运算符包括逻辑与(&&)、逻辑或(||)。如`a && b`只有在a和b都为真时才返回真,`a || b`在a或b任一为真时返回真。在我们的例子中,`a && b`返回真,因为10和20都是非零值。 Ruby还有一种三元运算符,也叫条件...
在第9章“运算符1”中,我们主要探讨了两种逻辑运算符:`||`(或)和`&&`(与),以及条件运算符(三元运算符)和范围运算符。此外,还提到了如何在Ruby中自定义运算符。 首先,`||`运算符,也称为逻辑或运算符,它...
Ruby支持多种运算符,包括算术运算符、关系运算符、逻辑运算符等。这一章节会展示如何在Ruby程序中运用这些运算符。 第3章:Ruby中的字符串操作。在Ruby中,字符串是一个重要的数据类型,本章将介绍如何创建和操作...
=、<、>)和逻辑运算符(&&、||、!)等。 - **标识名和变量作用域**:Ruby中的变量根据作用域可分为局部变量、实例变量、类变量和全局变量。 - **数据类型**:Ruby支持多种内置的数据类型,如整型、浮点型、字符串、...
Ruby 中的运算符涵盖了算术运算符、赋值运算符、逻辑运算符等。在使用时,应遵循语言规范以避免逻辑错误。 #### 注释 注释(Comments)用于提供代码的说明,它们不会被 Ruby 解释器执行。Ruby 支持单行注释和多行...
Ruby提供了多种运算符,包括算术运算符、关系运算符、逻辑运算符和赋值运算符等。以下是一些常用的运算符: - 算术运算符:`+`(加)、`-`(减)、`*`(乘)、`/`(除)、`%`(取模)、`**`(幂运算) - 关系运算符...
Ruby语言教程可以涵盖从基础到高级的多个方面,以下是一个详细的Ruby语言教程概述: 一、Ruby语言概述 ...=、<、>)和逻辑运算符(如&&、||、!),以及一些特殊的运算符,如范围运算符(..和...)和赋值运
通过`ruby-4-variables.mp4`和`ruby-5-variables-rules.mp4`,你可以深入理解变量的用法和规则,而`ruby-6-expression.mp4`将帮助你掌握如何在Ruby中构建和使用表达式。这些视频教程将为你提供一个坚实的Ruby编程...
`if` 和 `unless` 语句在Ruby中广泛使用,但它们的替代品,如三元运算符和逻辑运算符(`&&` 和 `||`),有时能提供更好的性能。`fast-ruby` 分析了这些情况并提供了实例。 5. **迭代器和范围操作** 在处理大量...
Ruby的逻辑运算符`and`(`&&`)和`or`(`||`)具有短路特性,而`&`和`|`则会始终计算整个表达式。例如,`x = x + 1 while x 会将`x`增加到10。 1.3 鸭子类型 Ruby是动态类型语言,类型检查发生在运行时。这意味着在...
- **运算符**: Ruby支持多种运算符,包括一元运算符、算术运算符、位运算符、逻辑运算符和三元运算符。 - **RubyGems**: RubyGems是Ruby的标准包管理系统,用于分发Ruby程序和库。 - **变量类型**: Ruby支持四种类型...
6. **运算符和表达式**:掌握Ruby中的算术运算符、比较运算符、逻辑运算符,以及了解运算符的优先级,学习如何使用它们进行复杂的表达式计算。 7. **掌握基本的控制结构**:学习Ruby的顺序结构(如语句的执行顺序)...
运算符是编程中不可或缺的组成部分,Ruby支持常见的算术、比较、逻辑运算符,以及范围、赋值、一元等其他运算符。控制流语句决定了程序的执行路径,Ruby中常见的控制流语句包括if条件语句、case多分支语句、while和...
- Ruby支持多种运算符,包括算术运算符(如加、减、乘、除)、比较运算符(如等于、不等于)、逻辑运算符(如与、或、非)等。 **3. Comments(注释)** - 注释是用来解释代码的文本,在运行时会被忽略。Ruby...
包括算术运算符、比较运算符、逻辑运算符等。 ```ruby a = 5 + 3 b = a == 8 c = !b ``` **6.2 命令替换** 可以在命令行中执行shell命令并获取其输出。 ```ruby output = `ls` ``` **6.3 赋值运算符** 用于将...