Ruby学习之记录下运算符

Ruby有一套丰富的运算符,我们实际上可以把大多数运算符看作是方法的调用,像a + b 就可以看做 a.+(b),其中指向变量 a 的 + 方法被调用,b 作为方法调用的参数,对于每个运算符(+ - * / % ** & | ^ << >> && ||),Ruby都有一个相对应的缩写赋值运算符(+= -= 等等)。

假设变量 a 的值为 10,变量 b 的值为 20,我们来看下Ruby的算数运算符:

运算符描述实例
+加法 - 把运算符两边的操作数相加a + b 将得到 30
-减法 - 把左操作数减去右操作数a - b 将得到 -10
*乘法 - 把运算符两边的操作数相乘a * b 将得到 200
/除法 - 把左操作数除以右操作数b / a 将得到 2
%求模 - 把左操作数除以右操作数,返回余数b % a 将得到 0
**指数 - 执行指数计算a**b 将得到 10 的 20 次方

还有比较运算符:

运算符描述实例
==检查两个操作数的值是否相等,如果相等则条件为真。(a == b) 不为真。
!=检查两个操作数的值是否相等,如果不相等则条件为真。(a != b) 为真。
>检查左操作数的值是否大于右操作数的值,如果是则条件为真。(a > b) 不为真。
<检查左操作数的值是否小于右操作数的值,如果是则条件为真。(a < b) 为真。
>=检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。(a >= b) 不为真。
<=检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。(a <= b) 为真。
<=>联合比较运算符。如果第一个操作数等于第二个操作数则返回 0,如果第一个操作数大于第二个操作数则返回 1,如果第一个操作数小于第二个操作数则返回 -1。(a <=> b) 返回 -1。
===用于测试 case 语句的 when 子句内的相等。(1...10) === 5 返回 true。
.eql?如果接收器和参数具有相同的类型和相等的值,则返回 true。1 == 1.0 返回 true,但是 1.eql?(1.0) 返回 false。
equal?如果接收器和参数具有相同的对象 id,则返回 true。如果 aObj 是 bObj 的副本,那么 aObj == bObj 返回 true,a.equal?bObj 返回 false,但是 a.equal?aObj 返回 true。

还有赋值运算符:

运算符描述实例
=简单的赋值运算符,把右操作数的值赋给左操作数c = a + b 将把 a + b 的值赋给 c
+=加且赋值运算符,把右操作数加上左操作数的结果赋值给左操作数c += a 相当于 c = c + a
-=减且赋值运算符,把左操作数减去右操作数的结果赋值给左操作数c -= a 相当于 c = c - a
*=乘且赋值运算符,把右操作数乘以左操作数的结果赋值给左操作数c *= a 相当于 c = c * a
/=除且赋值运算符,把左操作数除以右操作数的结果赋值给左操作数c /= a 相当于 c = c / a
%=求模且赋值运算符,求两个操作数的模赋值给左操作数c %= a 相当于 c = c % a
**=指数且赋值运算符,执行指数计算,并赋值给左操作数c **= a 相当于 c = c ** a

同时呢,Ruby还支持并行赋值,用法如下:

a = 10
b = 20
c = 30
#等价于
a, b, c = 10, 20, 30
#还可以用于交换两个变量的值
a, b = b, c

还有就是位运算符,它作用于位,并逐位执行操作,我们假设 a = 60,且 b = 13,现在以二进制格式,它们如下所示:

a = 0011 1100

b = 0000 1101

使用位运算符:

a&b = 0000 1100

a|b = 0011 1101

a^b = 0011 0001

~a  = 1100 0011

来看下Ruby支持的位运算符:

运算符描述实例
&如果同时存在于两个操作数中,二进制 AND 运算符复制一位到结果中。(a & b) 将得到 12,即为 0000 1100
|如果存在于任一操作数中,二进制 OR 运算符复制一位到结果中。(a | b) 将得到 61,即为 0011 1101
^如果存在于其中一个操作数中但不同时存在于两个操作数中,二进制异或运算符复制一位到结果中。(a ^ b) 将得到 49,即为 0011 0001
~二进制补码运算符是一元运算符,具有"翻转"位效果,即0变成1,1变成0。(~a ) 将得到 -61,即为 1100 0011,一个有符号二进制数的补码形式。
<<二进制左移运算符。左操作数的值向左移动右操作数指定的位数。a << 2 将得到 240,即为 1111 0000
>>二进制右移运算符。左操作数的值向右移动右操作数指定的位数。a >> 2 将得到 15,即为 0000 1111

再来看逻辑运算符,变量 a 的值为 10,变量 b 的值为 20:

运算符描述实例
and称为逻辑与运算符。如果两个操作数都为真,则条件为真。(a and b) 为真。
or称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。(a or b) 为真。
&&称为逻辑与运算符。如果两个操作数都非零,则条件为真。(a && b) 为真。
||称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。(a || b) 为真。
!称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。!(a && b) 为假。
not称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。not(a && b) 为假。

我们把有一个以上的操作称为三元运算符,第一个计算表达式的真假值,然后根据这个结果决定执行后边两个语句中的一个,条件运算符的语法如下:

运算符描述实例
? :条件表达式如果条件为真 ? 则值为 X : 否则值为 Y

在 Ruby 中,序列范围用于创建一系列连续的值 - 包含起始值、结束值(视情况而定)和它们之间的值,这些序列是使用 ".." 和 "..." 范围运算符来创建的。两点形式创建的范围包含起始值和结束值,三点形式创建的范围只包含起始值不包含结束值,来看下列表:

运算符描述实例
..创建一个从开始点到结束点的范围(包含结束点)1..10 创建从 1 到 10 的范围
...创建一个从开始点到结束点的范围(不包含结束点)1...10 创建从 1 到 9 的范围

还有就是defined?运算符,它是一个特殊的运算符,以方法调用的形式来判断传递的表达式是否已定义返回表达式的描述字符串,如果表达式未定义则返回nil,来看下用法:

#1、defined? variable  如果 variable 已经初始化,则为 True
foo = 42
defined? foo    # => "local-variable"
defined? $_     # => "global-variable"
defined? bar    # => nil(未定义)

#2、defined? method_call  如果方法已经定义,则为 True
defined? puts        # => "method"
defined? puts(bar)   # => nil(在这里 bar 未定义)
defined? unpack      # => nil(在这里未定义)

#3、defined? super  如果存在可被 super 用户调用的方法,则为 True
defined? super     # => "super"(如果可被调用)
defined? super     # => nil(如果不可被调用)

#4、defined? yield   如果已传递代码块,则为 True
defined? yield    # => "yield"(如果已传递块)
defined? yield    # => nil(如果未传递块)

之后就要来介绍点运算符“.”和双冒号运算符“::”了。

我们可以通过在方法名称前加上类或模块名称和 . 来调用类或模块中的方法,也可以使用类或模块名称和两个冒号 :: 来引用类或模块中的常量,:: 是一元运算符,允许在类或模块内定义常量、实例方法和类方法,可以从类或模块外的任何地方进行访问,顺道说一句,在 Ruby 中,类和方法也可以被当作常量,我们只需要在表达式的常量名前加上 :: 前缀,即可返回适当的类或模块对象,如果 :: 前的表达式为类或模块名称,则返回该类或模块内对应的常量值;如果 :: 前未没有前缀表达式,则返回主Object类中对应的常量值,来看两个实例:

#1
MR_COUNT = 0        # 定义在主 Object 类上的常量
module Foo
  MR_COUNT = 0
  ::MR_COUNT = 1    # 设置全局计数为 1
  MR_COUNT = 2      # 设置局部计数为 2
end
puts MR_COUNT       # 这是全局常量
puts Foo::MR_COUNT  # 这是 "Foo" 的局部常量

#2
CONST = ' out there'
class Inside_one
   CONST = proc {' in there'}
   def where_is_my_CONST
      ::CONST + ' inside one'
   end
end
class Inside_two
   CONST = ' inside two'
   def where_is_my_CONST
      CONST
   end
end
puts Inside_one.new.where_is_my_CONST
puts Inside_two.new.where_is_my_CONST
puts Object::CONST + Inside_two::CONST
puts Inside_two::CONST + CONST
puts Inside_one::CONST
puts Inside_one::CONST.call + Inside_two::CONST

最后来看下运算符的优先级:

方法运算符描述
::常量解析运算符
[ ] [ ]=元素引用、元素集合
**指数
! ~ + -非、补、一元加、一元减(最后两个的方法名为 +@ 和 -@)
* / %乘法、除法、求模
+ -加法和减法
>> <<位右移、位左移
&位与
^ |位异或、位或
<= < > >=比较运算符
<=> == === != =~ !~相等和模式匹配运算符(!= 和 !~ 不能被定义为方法)
 &&逻辑与
 ||逻辑或
 .. ...范围(包含、不包含)
 ? :三元 if-then-else
 = %= { /= -= += |= &= >>= <<= *= &&= ||= **=赋值
 defined?检查指定符号是否已定义
 not逻辑否定
 or and逻辑组成

上述表格在方法列标识为 “是” 的运算符实际上是方法,因此可以被重载。

好啦,本次记录就到这里了。

如果感觉不错的话,请多多点赞支持哦。。。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luyaran

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值