`
clark1231
  • 浏览: 248135 次
  • 性别: 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与&&/||使用时有些个混乱,特意找了几篇文章整理了下

相关推荐

    Ruby的教程.txt

    运算符与控制流:掌握Ruby中的运算符(如算术运算符、比较运算符、逻辑运算符等),以及控制流语句(如条件语句、循环语句等)。 函数与模块:学习如何定义和使用函数,了解模块的概念和用法,实现代码的复用和...

    详解Ruby当中的算数运算

    Ruby支持一系列丰富的运算符的一个现代化的语言。大多数运算符实际上是方法调用。例如,a + b的被解释为a, +(b)变量引用的对象的方法被称为一个用b作为它的参数。 对于每个运算符 (+ – * / % ** & | ^ << >> ...

    验证:Ruby对象的验证mixin

    花见::验证Ruby对象的... 为此,我们将业务需求转换为谓词,这些谓词与Ruby人造布尔逻辑运算符(例如&或| )链接在一起。 想想一个注册表格。 我们需要使用以下规则来确保name字段的数据完整性。 这是必需的,它必须:

    square_array-ruby-apply-000

    Google Ruby的指数运算符,或参考上一课中有关简单数学的内容。先进的一旦测试通过,请查看是否可以使用更高级别的迭代器(例如.collect 。期望例子numbers = [ 1 , 2 , 3 ]square_array ( numbers )# => [1,4,9])...

    Programming-univbasics-4-square-array-online-web-prework

    Google Ruby的指数运算符,或参考上一课中有关简单数学的内容。申请while遍历数组要构建此方法,请在while使用迭代器并实现自己的逻辑。 仅使用while , Array和该解决方案的任何其他先前讨论的方法。 不要使用Ruby...

    priora:Ruby的对象优先级排序实用程序

    Priora:用于Ruby的对象优先级排序实用程序 Priora提供了一种简单直观的方法来对Ruby中的对象集合进行优先级排序。它是一个有用的实用程序,用于处理某些数据类的多个实例的集合。通常,我们希望按照某种优先级排序...

    square_array-v-000

    Google Ruby的指数运算符,或参考上一课中有关简单数学的内容。 先进的 一旦测试通过,请查看是否可以使用更高级别的迭代器(例如.collect 。 期望例子 numbers = [ 1 , 2 , 3 ] square_array ( numbers ) # => [1,...

    square_array-001-prework-web

    Google Ruby的指数运算符,或参考上一课中有关简单数学的内容。 先进的 一旦测试通过,请查看是否可以使用更高级别的迭代器(例如.collect 。 期望例子 numbers = [ 1 , 2 , 3 ] square_array ( numbers ) # => [1,...

    square_array-online-web-prework

    Google Ruby的指数运算符,或参考上一课中有关简单数学的内容。 先进的 一旦测试通过,请查看是否可以使用更高级别的迭代器(例如.collect 。 期望例子 numbers = [ 1 , 2 , 3 ] square_array ( numbers ) # => [1,...

    square_array-online-web-sp-000

    Google Ruby的指数运算符,或参考上一课中有关简单数学的内容。 先进的 一旦测试通过,请查看是否可以使用更高级别的迭代器(例如.collect 。 期望例子 numbers = [ 1 , 2 , 3 ] square_array ( numbers ) # => [1,...

    mininode:由Node.js创建的微型Node.js使用Node.js创建的Node.js

    使用Node.js创建的Node.js 印象深刻的是我挑战用Node.js制作迷你Node.js. ...初榨esprima ...... ......符的计算器......添加否定和逻辑运算符 执照/执照 该示例已获得MIT许可 该存储库由MIT许可证提供

    learntoprogram:我在 Chris Pine 的《学习编程》第二版中工作时的代码片段

    Lear to Program 中工作时的代码片段,第二版第02章 - 数字简单算术导论整数和浮点数第05章 混合铸造/转换简介带有 get 和 chomp 的用户输入第 06 章 - 关于方法的更多信息字符串方法简介模运算符随机数和 ...

    JavaScript权威指南(第6版)中文文字版

    弗兰纳根(David Flanagan)是一名程序员,也是一名作家,他在O’Reilly出版的其他畅销书还包括《JavaScript Pocket Reference》、《The Ruby Programming Language》、以及《Java in a Nutshell》。David毕业于麻省...

    JavaScript权威指南(第六版) 清晰-完整

    他在O’Reilly出版的其他畅销书还包括《JavaScript Pocket Reference》、《The Ruby Programming Language》、以及《Java in a Nutshell》。David毕业于麻省理工学院,获得计算机科学与工程学位。他和妻子和孩子一起...

    JavaScript权威指南(第6版)(附源码)

    他在O’Reilly出版的其他畅销书还包括《JavaScriptPocket Reference》、《The Ruby Programming Language》、以及《Java in aNutshell》。David毕业于麻省理工学院,获得计算机科学与工程学位。他和妻子和孩子一起...

    JavaScript权威指南(第6版)(中文版)

    他在O’Reilly出版的其他畅销书还包括《JavaScript Pocket Reference》、《The Ruby Programming Language》、以及《Java in a Nutshell》。David毕业于麻省理工学院,获得计算机科学与工程学位。他和妻子和孩子一起...

    JavaScript权威指南(第6版)

    他在O’Reilly出版的其他畅销书还包括《JavaScript Pocket Reference》、《The Ruby Programming Language》、以及《Java in a Nutshell》。David毕业于麻省理工学院,获得计算机科学与工程学位。他和妻子和孩子一起...

    疯狂JAVA讲义

    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...

    JavaScript权威指南(第6版)

    弗兰纳根(David Flanagan)是一名程序员,也是一名作家,他在O’Reilly出版的其他畅销书还包括《JavaScript Pocket Reference》、《The Ruby Programming Language》、以及《Java in a Nutshell》。David毕业于麻省...

    Coeus:CTL模型检查器

    Coeus是计算树逻辑(CTL)模型检查器。 特别是,它支持以下工作流程: 定义状态机模型 解析CTL表达式字符串 根据模型评估CTL表达式 建筑学 Coeus由3个关键组件组成:模型,CTL表达解析器和标签算法 模型 严格来说,...

Global site tag (gtag.js) - Google Analytics