`
clark1231
  • 浏览: 256565 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

ruby中的逻辑运算符

    博客分类:
  • ruby
阅读更多
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!
  
分享到:
评论
1 楼 clark1231 2012-06-11  
在看ruby编码风格的时候发现自己对and/or与&&/||使用时有些个混乱,特意找了几篇文章整理了下

相关推荐

    02Ruby 运算符.docx

    综上所述,Ruby中的运算符不仅仅局限于数学运算,还涵盖了逻辑运算、赋值、并行赋值以及位运算等多个方面,极大地丰富了Ruby语言的功能性和灵活性。通过深入理解这些运算符的特点和用法,开发者能够更高效地利用Ruby...

    Ruby的运算符和语句优先级介绍

    逻辑运算符中的"&&"(逻辑与)优先级高于"||"(逻辑或)。如果不清楚具体的优先级,可能会导致意外的代码执行结果或错误。 ### 语句优先级 在Ruby中,语句的执行也遵循优先级规则。特别是在涉及复合语句,如条件...

    详解Ruby当中的算数运算

    逻辑运算符包括逻辑与(&&)、逻辑或(||)。如`a && b`只有在a和b都为真时才返回真,`a || b`在a或b任一为真时返回真。在我们的例子中,`a && b`返回真,因为10和20都是非零值。 Ruby还有一种三元运算符,也叫条件...

    ruby基础教程(第四版)第9章 运算符1

    在第9章“运算符1”中,我们主要探讨了两种逻辑运算符:`||`(或)和`&&`(与),以及条件运算符(三元运算符)和范围运算符。此外,还提到了如何在Ruby中自定义运算符。 首先,`||`运算符,也称为逻辑或运算符,它...

    Ruby Quick Syntax Reference.pdf

    Ruby支持多种运算符,包括算术运算符、关系运算符、逻辑运算符等。这一章节会展示如何在Ruby程序中运用这些运算符。 第3章:Ruby中的字符串操作。在Ruby中,字符串是一个重要的数据类型,本章将介绍如何创建和操作...

    ruby 中文 教程 从入门到精通

    =、<、>)和逻辑运算符(&&、||、!)等。 - **标识名和变量作用域**:Ruby中的变量根据作用域可分为局部变量、实例变量、类变量和全局变量。 - **数据类型**:Ruby支持多种内置的数据类型,如整型、浮点型、字符串、...

    Ruby Pocket Reference.pdf

    Ruby 中的运算符涵盖了算术运算符、赋值运算符、逻辑运算符等。在使用时,应遵循语言规范以避免逻辑错误。 #### 注释 注释(Comments)用于提供代码的说明,它们不会被 Ruby 解释器执行。Ruby 支持单行注释和多行...

    Ruby+编程语言的基础知识:变量、运算符、流程控制

    Ruby提供了多种运算符,包括算术运算符、关系运算符、逻辑运算符和赋值运算符等。以下是一些常用的运算符: - 算术运算符:`+`(加)、`-`(减)、`*`(乘)、`/`(除)、`%`(取模)、`**`(幂运算) - 关系运算符...

    Ruby语言介绍.doc

    Ruby语言教程可以涵盖从基础到高级的多个方面,以下是一个详细的Ruby语言教程概述: 一、Ruby语言概述 ...=、<、>)和逻辑运算符(如&&、||、!),以及一些特殊的运算符,如范围运算符(..和...)和赋值运

    Ruby 基础语法 视频教程1

    通过`ruby-4-variables.mp4`和`ruby-5-variables-rules.mp4`,你可以深入理解变量的用法和规则,而`ruby-6-expression.mp4`将帮助你掌握如何在Ruby中构建和使用表达式。这些视频教程将为你提供一个坚实的Ruby编程...

    Ruby-fastrubyRuby编写快速收集常见Ruby惯用语

    `if` 和 `unless` 语句在Ruby中广泛使用,但它们的替代品,如三元运算符和逻辑运算符(`&&` 和 `||`),有时能提供更好的性能。`fast-ruby` 分析了这些情况并提供了实例。 5. **迭代器和范围操作** 在处理大量...

    Ruby的语法和语言特性总结

    Ruby的逻辑运算符`and`(`&&`)和`or`(`||`)具有短路特性,而`&`和`|`则会始终计算整个表达式。例如,`x = x + 1 while x 会将`x`增加到10。 1.3 鸭子类型 Ruby是动态类型语言,类型检查发生在运行时。这意味着在...

    Ruby面试题和答案(2024年收集更新)

    - **运算符**: Ruby支持多种运算符,包括一元运算符、算术运算符、位运算符、逻辑运算符和三元运算符。 - **RubyGems**: RubyGems是Ruby的标准包管理系统,用于分发Ruby程序和库。 - **变量类型**: Ruby支持四种类型...

    ruby培训---5天搞定之第1天1

    6. **运算符和表达式**:掌握Ruby中的算术运算符、比较运算符、逻辑运算符,以及了解运算符的优先级,学习如何使用它们进行复杂的表达式计算。 7. **掌握基本的控制结构**:学习Ruby的顺序结构(如语句的执行顺序)...

    Ruby的教程.txt

    运算符是编程中不可或缺的组成部分,Ruby支持常见的算术、比较、逻辑运算符,以及范围、赋值、一元等其他运算符。控制流语句决定了程序的执行路径,Ruby中常见的控制流语句包括if条件语句、case多分支语句、while和...

    ruby 中文教程 源代码

    - **运算符**:包括算术运算符、比较运算符、逻辑运算符等。 - **变量的作用域**:局部变量、实例变量、类变量、全局变量等,每种变量都有不同的作用范围。 - **数据类型**:基本类型如整数、浮点数、字符串、布尔值...

    Ruby袖珍参考手册

    - Ruby支持多种运算符,包括算术运算符(如加、减、乘、除)、比较运算符(如等于、不等于)、逻辑运算符(如与、或、非)等。 **3. Comments(注释)** - 注释是用来解释代码的文本,在运行时会被忽略。Ruby...

    ruby初学者教程(对初学者很有帮助)

    包括算术运算符、比较运算符、逻辑运算符等。 ```ruby a = 5 + 3 b = a == 8 c = !b ``` **6.2 命令替换** 可以在命令行中执行shell命令并获取其输出。 ```ruby output = `ls` ``` **6.3 赋值运算符** 用于将...

Global site tag (gtag.js) - Google Analytics